cleanupLootCrate() {
    return this.whenRequiredResourcesReady().then((requestId) => {
      if (!this.getAreResourcesValid(requestId)) return; // load invalidated or resources changed

      return new Promise((resolve, reject) => {
        audio_engine.current().play_effect(RSX.sfx_loot_crate_reward_disappear.audio, false);
        this.runAction(cc.sequence(
          cc.callFunc(() => {
            for (let i = 0; i < this._rewardNodes.length; i++) {
              this._rewardNodes[i].destroy(CONFIG.ANIMATE_FAST_DURATION);
            }
          }),
          cc.delayTime(CONFIG.ANIMATE_FAST_DURATION),
          cc.callFunc(() => {
            this.destroy();
            resolve();
          }),
        ));
      })
        .catch((error) => { EventBus.getInstance().trigger(EVENTS.error, error); });
    });
  }
Promisified - Transitions out the loot crate
@public
@return {Promise} A promise which resolves when the loot crate has finished animating out