Example #1
0
  /**
   * Method prepareWriteBuffer.
   *
   * @param con MMOConnection<T>
   */
  protected void prepareWriteBuffer(MMOConnection<T> con) {
    WRITE_CLIENT = con.getClient();
    DIRECT_WRITE_BUFFER.clear();

    if (con.hasPendingWriteBuffer()) {
      con.movePendingWriteBufferTo(DIRECT_WRITE_BUFFER);
    }

    if (DIRECT_WRITE_BUFFER.hasRemaining() && !con.hasPendingWriteBuffer()) {
      int i;
      Queue<SendablePacket<T>> sendQueue = con.getSendQueue();
      SendablePacket<T> sp;

      for (i = 0; i < _sc.MAX_SEND_PER_PASS; i++) {
        synchronized (con) {
          if ((sp = sendQueue.poll()) == null) {
            break;
          }
        }

        try {
          stats.increaseOutgoingPacketsCount();
          putPacketIntoWriteBuffer(sp, true);
          WRITE_BUFFER.flip();
          if (DIRECT_WRITE_BUFFER.remaining() >= WRITE_BUFFER.limit()) {
            DIRECT_WRITE_BUFFER.put(WRITE_BUFFER);
          } else {
            con.createWriteBuffer(WRITE_BUFFER);
            break;
          }
        } catch (Exception e) {
          _log.error("Error in " + getName(), e);
          break;
        }
      }
    }

    WRITE_BUFFER.clear();
    WRITE_CLIENT = null;
  }