@Override
 public void write(final ChannelHandlerContext ctx, Object msg, final ChannelPromise promise)
     throws Exception {
   if (msg instanceof ChannelWriter) {
     @SuppressWarnings("unchecked")
     ChannelWriter dataWriter = (ChannelWriter) msg;
     if (dataWriter.flushMode == FlushMode.MANUAL_COMPLETE) {
       dataWriter.writeStream.subscribe(new FlushOnTerminateSubscriber(ctx, promise));
     } else {
       dataWriter.writeStream.subscribe(new FlushOnEachSubscriber(ctx, promise));
     }
   } else {
     super.write(ctx, msg, promise);
   }
 }
    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)
        throws Exception {
      for (Entry<PacketListener, List<Method>> listener : OUT.entrySet()) {
        for (Method method : listener.getValue()) {

          PacketHandler ann = method.getAnnotation(PacketHandler.class);
          if (!ann.packet().getName().equals(msg.getClass().getSimpleName())) continue;
          PacketEvent evt = new PacketEvent(player, msg);
          method.setAccessible(true);
          method.invoke(listener.getKey(), evt);
          msg = evt.getPacket();
        }
      }

      if (msg != null) {
        super.write(ctx, msg, promise);
      }
    }
  @SuppressWarnings("unchecked")
  @Override
  public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)
      throws Exception {
    if (PlayOutTileEntityData.isInstance(msg)) {

      Object tag = ReflectionUtil.getObject(msg, "c");
      Object owner =
          ReflectionUtil.invokeMethod(
              tag.getClass(), tag, "getCompound", new Class<?>[] {String.class}, "Owner");

      if (!owner.toString().isEmpty()) {

        Object props =
            ReflectionUtil.invokeMethod(
                owner.getClass(),
                owner,
                "getCompound",
                new Class<?>[] {String.class},
                "Properties");

        if (!props.toString().isEmpty()) {

          Map<String, Object> map = (Map<String, Object>) ReflectionUtil.getObject(props, "map");

          for (Entry<String, Object> entry : map.entrySet()) {

            if (!entry.getKey().equals("textures")) continue;

            String value = entry.getValue().toString();
            if (value.contains("\"\"") || !value.contains("Value:\"")) {
              return;
            }
          }
        }
      }
    }

    super.write(ctx, msg, promise);
  }