code: private void unqueueWaves() {
  
          // Extract the next wave to run
          final Wave waveToRun = this.waveList.get(this.index);
  
          // The wave is null skip it and launch the next one
          if (waveToRun == null) {
  
              if (CoreParameters.DEVELOPER_MODE.get()) {
                  throw new CoreRuntimeException("ChainWaveCommand shouldn't be called with null wave");
              }
  
              this.index++;
              // Run next command if any
              if (this.waveList.size() > this.index) {
                  unqueueWaves();
              } else {
                  // The null wave was the last so we can declare the command as fully handled
                  fireHandled(this.sourceWave);
              }
          } else {
  
              LOGGER.trace("Unqueue wave N° " + this.index + " >> " + waveToRun.toString());
  
              // Attach a listener to be informed when the wave will be consumed
              waveToRun.addWaveListener(this);
              // Send it to the queue in order to perform it
              sendWave(waveToRun);
          }
  
      }
docs: Recursive call.