示例#1
0
        /// <summary>
        /// Envia um pacote para o servidor
        /// </summary>
        /// <param name="packet">Pacote a ser enviado</param>
        public virtual void SendPacket(BaseSendPacket packet)
        {
            // Validar
            if (packet == null)
            {
                return;
            }

            try
            {
                // Obter opcode
                ushort opcodeId = packet.GetType()
                                  .GetCustomAttributes(true)
                                  .Where(x => x != null)
                                  .OfType <SendPacketAttribute>()
                                  .ToList()
                                  .Select(x => x.Id)
                                  .FirstOrDefault();
                if (opcodeId <= 0)
                {
                    throw new PointBlankException("Não foi informado o atributo 'SendPacket'");
                }

                // Adicionar opcode
                byte[] bytes = BitConverter.GetBytes(opcodeId);
                this.stream.Write(bytes, 0, bytes.Length);

                // Adicionar dados do pacotr
                packet.WriteStream();
                byte[] packetBytes = packet.mstream.ToArray();

                ushort      size = Convert.ToUInt16(packetBytes.Length - 2);
                List <byte> list = new List <byte>(packetBytes.Length + 2);
                list.AddRange(BitConverter.GetBytes(size));
                list.AddRange(packetBytes);
                if (list.Count > 0)
                {
                    this.stream.Write(list.ToArray(), 0, list.Count);
                }

                list.Clear();
            }
            catch (Exception exp)
            {
                Logger.Error(
                    new PointBlankException(string.Format("[SendPacket] Erro no ao efetuar o envio da packet: {0}", packet.GetType().Name), exp));
            }
            finally
            {
                try
                {
                    packet.Dispose();
                    packet = null;
                }
                catch (Exception exp)
                {
                    Logger.Error(new PointBlankException("[SendPacket] Erro no ao efetuar 'Dispose' da packet", exp));
                }
            }
        }
示例#2
0
        /// <summary>
        /// Envia um pacote para todos os jogadores conectados
        /// </summary>
        /// <param name="packet">Pacote a ser enviada</param>
        public void EnviarPacoteTodosJogadores(BaseSendPacket packet)
        {
            if (this.ListaClientes.Count <= 0)
            {
                throw new PointBlankException("Nenhum cliente conectado atualmente");
            }

            // Enviar pacote individualmente
            IList <Task> listaTarefas = new List <Task>();

            foreach (BaseClient client in this.ListaClientes)
            {
                try
                {
                    Task taskTmp = new Task(() => client.SendPacket(packet));
                    listaTarefas.Add(taskTmp);
                    taskTmp.Start();
                }
                catch (Exception exp)
                {
                    Logger.Error(exp, "Envio de pacote para todos os jogadores", !(exp is PointBlankException));
                }
            }

            // Aguardar execução
            Task.WaitAll(listaTarefas.ToArray());
        }