/// <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)); } } }
/// <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()); }