private static void HandleStartImprovise(GameSession session, PacketReader packet)
    {
        long itemUid = packet.ReadLong();

        if (!session.Player.Inventory.HasItem(itemUid))
        {
            return;
        }

        Item item = session.Player.Inventory.GetByUid(itemUid);

        InstrumentInfoMetadata         instrumentInfo     = InstrumentInfoMetadataStorage.GetMetadata(item.Function.Id);
        InstrumentCategoryInfoMetadata instrumentCategory = InstrumentCategoryInfoMetadataStorage.GetMetadata(instrumentInfo.Category);

        Instrument instrument = new(instrumentCategory.GMId, instrumentCategory.PercussionId, false, session.Player.FieldPlayer.ObjectId)
        {
            Improvise = true
        };

        session.Player.Instrument       = session.FieldManager.RequestFieldObject(instrument);
        session.Player.Instrument.Coord = session.Player.FieldPlayer.Coord;
        session.FieldManager.AddInstrument(session.Player.Instrument);
        session.FieldManager.BroadcastPacket(InstrumentPacket.StartImprovise(session.Player.Instrument));
    }
    private static void HandlePlayScore(GameSession session, PacketReader packet)
    {
        long instrumentItemUid = packet.ReadLong();
        long scoreItemUid      = packet.ReadLong();

        if (!session.Player.Inventory.HasItem(scoreItemUid) || !session.Player.Inventory.HasItem(instrumentItemUid))
        {
            return;
        }

        Item instrumentItem = session.Player.Inventory.GetByUid(instrumentItemUid);

        InstrumentInfoMetadata         instrumentInfo     = InstrumentInfoMetadataStorage.GetMetadata(instrumentItem.Function.Id);
        InstrumentCategoryInfoMetadata instrumentCategory = InstrumentCategoryInfoMetadataStorage.GetMetadata(instrumentInfo.Category);

        Item score = session.Player.Inventory.GetByUid(scoreItemUid);

        if (score.PlayCount <= 0)
        {
            return;
        }

        Instrument instrument = new(instrumentCategory.GMId, instrumentCategory.PercussionId, score.IsCustomScore, session.Player.FieldPlayer.ObjectId)
        {
            InstrumentTick = session.ServerTick,
            Score          = score,
            Improvise      = false
        };

        score.PlayCount                -= 1;
        session.Player.Instrument       = session.FieldManager.RequestFieldObject(instrument);
        session.Player.Instrument.Coord = session.Player.FieldPlayer.Coord;
        session.FieldManager.AddInstrument(session.Player.Instrument);
        session.FieldManager.BroadcastPacket(InstrumentPacket.PlayScore(session.Player.Instrument));
        session.Send(InstrumentPacket.UpdateScoreUses(scoreItemUid, score.PlayCount));
    }
    private static void HandleStartEnsemble(GameSession session, PacketReader packet)
    {
        long instrumentItemUid = packet.ReadLong();
        long scoreItemUid      = packet.ReadLong();

        Party party = session.Player.Party;

        if (party == null)
        {
            return;
        }

        if (!session.Player.Inventory.HasItem(scoreItemUid) || !session.Player.Inventory.HasItem(instrumentItemUid))
        {
            return;
        }


        Item score = session.Player.Inventory.GetByUid(scoreItemUid);

        if (score.PlayCount <= 0)
        {
            return;
        }

        Item instrumentItem = session.Player.Inventory.GetByUid(instrumentItemUid);
        InstrumentInfoMetadata         instrumentInfo     = InstrumentInfoMetadataStorage.GetMetadata(instrumentItem.Function.Id);
        InstrumentCategoryInfoMetadata instrumentCategory = InstrumentCategoryInfoMetadataStorage.GetMetadata(instrumentInfo.Category);
        Instrument instrument = new(instrumentCategory.GMId, instrumentCategory.PercussionId, score.IsCustomScore, session.Player.FieldPlayer.ObjectId)
        {
            Score     = score,
            Ensemble  = true,
            Improvise = false
        };

        session.Player.Instrument       = session.FieldManager.RequestFieldObject(instrument);
        session.Player.Instrument.Coord = session.Player.FieldPlayer.Coord;

        if (session.Player != party.Leader)
        {
            return;
        }

        int instrumentTick = session.ServerTick;

        foreach (Player member in party.Members)
        {
            if (member.Instrument == null)
            {
                continue;
            }

            if (!member.Instrument.Value.Ensemble)
            {
                continue;
            }

            member.Instrument.Value.InstrumentTick = instrumentTick; // set the tick to be all the same
            member.Session.FieldManager.AddInstrument(member.Session.Player.Instrument);
            session.FieldManager.BroadcastPacket(InstrumentPacket.PlayScore(member.Session.Player.Instrument));
            member.Instrument.Value.Score.PlayCount -= 1;
            member.Session.Send(InstrumentPacket.UpdateScoreUses(member.Instrument.Value.Score.Uid, member.Instrument.Value.Score.PlayCount));
            member.Instrument.Value.Ensemble = false;
        }
    }