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

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

            Item item = session.Player.Inventory.Items[itemUid];

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

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

            session.Player.Instrument       = session.FieldManager.RequestFieldObject(instrument);
            session.Player.Instrument.Coord = session.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.Items.ContainsKey(scoreItemUid) || !session.Player.Inventory.Items.ContainsKey(instrumentItemUid))
            {
                return;
            }

            Item instrumentItem = session.Player.Inventory.Items[instrumentItemUid];

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

            Item score = session.Player.Inventory.Items[scoreItemUid];

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

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

            score.PlayCount                -= 1;
            session.Player.Instrument       = session.FieldManager.RequestFieldObject(instrument);
            session.Player.Instrument.Coord = session.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.Items.ContainsKey(scoreItemUid) || !session.Player.Inventory.Items.ContainsKey(instrumentItemUid))
            {
                return;
            }


            Item score = session.Player.Inventory.Items[scoreItemUid];

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

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

            session.Player.Instrument       = session.FieldManager.RequestFieldObject(instrument);
            session.Player.Instrument.Coord = session.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;
            }
        }