// =========================================================
// 涡轮全速！：速度保持在 [MIN_SPEED, MAX_SPEED] 持续 30 秒（连续）
// TASK: 2FC697FB6433D377
// =========================================================
;(() => {
  const TASK_ID = '2FC697FB6433D377'
  const DURATION_SECONDS = 30
  const MIN_SPEED = 29.50
  const MAX_SPEED = 35.00

  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = DURATION_SECONDS
    event.setCheckTimer(20)

    event.setCheck((task, player) => {
      const ship = VS.js().getShipPlayerIsOnStrict(player)
      if (ship == null) { task.progress = 0; return }

      const speed = Number(VS.js().getShipSpeed(ship))
      if (!isFinite(speed)) { task.progress = 0; return }

      if (speed >= MIN_SPEED && speed <= MAX_SPEED) task.progress++
      else task.progress = 0
    })
  })
})()



// =========================================================
// 突破卡门线：高度 ≥ 1000 持续 15 秒（连续）
// TASK: 2F8AF84670AF7C30
// =========================================================
;(() => {
  const TASK_ID = '2F8AF84670AF7C30'
  const DURATION_SECONDS = 15
  const MIN_Y = 1000

  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = DURATION_SECONDS
    event.setCheckTimer(20)

    event.setCheck((task, player) => {
      const ship = VS.js().getShipPlayerIsOnStrict(player)
      if (ship == null) { task.progress = 0; return }

      const pos = VS.js().getShipPosition(ship)
      if (pos == null) { task.progress = 0; return }

      const shipY = Number(pos[1])
      if (!isFinite(shipY)) { task.progress = 0; return }

      if (shipY > MIN_Y) task.progress++
      else task.progress = 0
    })
  })
})()



// =========================================================
// 飞跃地平线：船体高度 ≥ 500 时，累计水平距离（XZ，非连续）
// TASK: 5008A2CF87DC8D5A
// =========================================================
;(() => {
  const TASK_ID = '5008A2CF87DC8D5A'
  const MIN_Y = 500
  const REQUIRED_DISTANCE = 100000 // 单位：方块（水平距离）

  const KEY_DIST = 'vs_cloudrun_dist'   // double
  const KEY_LAST = 'vs_cloudrun_last'   // string: "x,z"

  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = REQUIRED_DISTANCE
    event.setCheckTimer(20) // 每秒采样一次

    event.setCheck((task, player) => {
      let dist = player.persistentData.getDouble(KEY_DIST)
      if (!isFinite(dist) || dist < 0) dist = 0

      const ship = VS.js().getShipPlayerIsOnStrict(player)
      const pos = ship ? VS.js().getShipPosition(ship) : null
      const x = pos ? Number(pos[0]) : NaN
      const y = pos ? Number(pos[1]) : NaN
      const z = pos ? Number(pos[2]) : NaN

      // 不在船上 / 拿不到坐标 / 高度不足：不涨、不清零，但清 last 防止大跳
      if (!isFinite(x) || !isFinite(y) || !isFinite(z) || y < MIN_Y) {
        player.persistentData.remove(KEY_LAST)
        task.progress = Math.min(Math.floor(dist), REQUIRED_DISTANCE)
        return
      }

      const last = player.persistentData.getString(KEY_LAST) || ''
      if (last) {
        const i = last.indexOf(',')
        if (i > 0) {
          const lx = Number(last.slice(0, i))
          const lz = Number(last.slice(i + 1))
          const dx = x - lx
          const dz = z - lz
          const d = Math.sqrt(dx * dx + dz * dz) // ✅ 只算水平距离

          // 防止异常大跳（传送/瞬移等），阈值按需调
          if (isFinite(d) && d > 0 && d < 50) {
            dist += d
            player.persistentData.putDouble(KEY_DIST, dist)
          }
        }
      }

      // 记录本次点
      player.persistentData.putString(KEY_LAST, `${x},${z}`)

      // 同步进度
      task.progress = Math.min(Math.floor(dist), REQUIRED_DISTANCE)
    })
  })
})()



// =========================================================
// 飞翔的荷兰人：累计玩家在任意船上的总时间（非连续）
// TASK: 你填任务ID
// =========================================================
;(() => {
  const TASK_ID = '085A289F185CEB46'
  const REQUIRED_SECONDS = 21600 // 例如 360分钟

  const KEY_TIME = `vs_onship_total_seconds_${TASK_ID}` // int
  const KEY_LOCK = `vs_onship_total_lock_${TASK_ID}`    // bool: 完成后需离船一次再重新累计

  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = REQUIRED_SECONDS
    event.setCheckTimer(20) // 每秒检查一次

    event.setCheck((task, player) => {
      let t = player.persistentData.getInt(KEY_TIME)
      if (t < 0) t = 0

      const ship = VS.js().getShipPlayerIsOnStrict(player)
      const locked = player.persistentData.getBoolean(KEY_LOCK)

      // 达标：先完成任务，再重置内部计时并锁定，避免立刻从 0 重新涨
      if (t >= REQUIRED_SECONDS) {
        task.progress = REQUIRED_SECONDS
        player.persistentData.putInt(KEY_TIME, 0)
        player.persistentData.putBoolean(KEY_LOCK, true)
        return
      }

      // 锁定期间不累计；玩家离船后解锁
      if (locked) {
        if (ship == null) player.persistentData.remove(KEY_LOCK)
        task.progress = 0
        return
      }

      // 在任意船上才累计；离船不重置，只是不增长
      if (ship != null) {
        t++
        player.persistentData.putInt(KEY_TIME, t)
      }

      task.progress = Math.min(t, REQUIRED_SECONDS)
    })
  })
})()



// =========================================================
// 雷暴飞行：雷暴 + 在飞艇上 + Y>200 时累计时间（非连续）
// TASK: 你填任务ID
// =========================================================
;(() => {
  const TASK_ID = '459101E4A55DE5FB'
  const REQUIRED_SECONDS = 3600
  const MIN_Y = 200
  const KEY_TIME = 'storm_ship_flight_seconds'

  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = REQUIRED_SECONDS
    event.setCheckTimer(20)

    event.setCheck((task, player) => {
      let t = player.persistentData.getInt(KEY_TIME)
      if (t < 0) t = 0

      const ship = VS.js().getShipPlayerIsOnStrict(player)
      const level = player.level
      const thundering = level && level.isThundering && level.isThundering()

      if (ship != null && thundering && player.y > MIN_Y && t < REQUIRED_SECONDS) {
        t++
        player.persistentData.putInt(KEY_TIME, t)
      }

      task.progress = Math.min(t, REQUIRED_SECONDS)
    })
  })
})()



// =========================================================
// 雷击近距离计数：在飞艇上 + Y>200 + 半径内雷击 -> 累计次数
// 完成后自动重置计数
// TASK: 你填任务ID
// =========================================================
;(() => {
  const TASK_ID = '3574FCDE406497AB'
  const REQUIRED_STRIKES = 10
  const RADIUS = 32
  const MIN_Y = 200
  const KEY_COUNT = 'storm_strike_near_ship_count'

  const R2 = RADIUS * RADIUS

  EntityEvents.spawned(event => {
    const e = event.entity
    if (!e || String(e.type) !== 'minecraft:lightning_bolt') return

    const level = e.level
    if (!level) return

    const lx = e.x, ly = e.y, lz = e.z

    level.players.forEach(p => {
      if (!p) return
      if (!VS.js().getShipPlayerIsOnStrict(p)) return
      if (p.y <= MIN_Y) return

      const dx = p.x - lx
      const dy = p.y - ly
      const dz = p.z - lz
      if (dx*dx + dy*dy + dz*dz > R2) return

      const cur = p.persistentData.getInt(KEY_COUNT)
      p.persistentData.putInt(KEY_COUNT, cur + 1)
    })
  })

  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = REQUIRED_STRIKES
    event.setCheckTimer(20)

    event.setCheck((task, player) => {
      const cur = player.persistentData.getInt(KEY_COUNT)

      if (cur >= REQUIRED_STRIKES) {
        task.progress = REQUIRED_STRIKES

        // ✅ 完成后重置
        player.persistentData.putInt(KEY_COUNT, 0)
      } else {
        task.progress = cur
      }
    })
  })
})()



;(() => {
// =========================================================
// 任务：纳吉尔法之役_1
// 规则：
// - 玩家当时严格在同一艘船上（strict）
// - 飞艇 Y > 100（使用 ship position）
// - 累计击杀50个僵尸、骷髅50
// =========================================================
  const TASK_ID = '2384D8A4D3B42839'
  const REQUIRED_KILLS = 50 // 需要击杀的数量

  // 目标生物（按需要增删，写 entity type id）
  // 例：'minecraft:zombie', 'minecraft:skeleton', 'alexsmobs:crimson_mosquito' ...
  const TARGET_TYPES = [
    'minecraft:zombie',
    // 'minecraft:zombie',
  ]

  // 计数键（持久化存玩家身上）
  const KEY_KILL_COUNT = 'vs_task_onship_kill_count'

  // =========================
  // 事件：飞艇上击杀特定生物 -> 累加计数
  // =========================
  EntityEvents.death(event => {
    const src = event.source
    if (!src) return

    // 只统计“玩家造成的击杀”（含近战/远程/附魔等，只要 source.player 能拿到）
    const player = src.player
    if (!player) return

    const target = event.entity
    if (!target) return

    // 目标类型过滤
    const typeId = String(target.type) // KubeJS 通常能转成 'minecraft:zombie' 这种
    if (!TARGET_TYPES.includes(typeId)) return

    // 必须在飞艇/船上（严格）
    if (!VS.js().isPlayerOnShipStrict(player)) return

    // 累加计数（int）
    const cur = player.persistentData.getInt(KEY_KILL_COUNT)
    player.persistentData.putInt(KEY_KILL_COUNT, cur + 1)
  })

  // =========================
  // FTB Quests：读取计数 -> 推进进度 -> 达标完成
  // =========================
  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = REQUIRED_KILLS
    event.setCheckTimer(20) // 每秒检查一次

    event.setCheck((task, player) => {
      const cur = player.persistentData.getInt(KEY_KILL_COUNT)

      // 进度按当前击杀数推进（上限 REQUIRED_KILLS）
      task.progress = Math.min(cur, REQUIRED_KILLS)

      // 可选：如果你希望完成后把计数清掉，避免后续重复利用旧计数
      if (cur >= REQUIRED_KILLS) {
        // 完成后清零（如果你想“永久累计不清零”，就删掉这两行）
        player.persistentData.putInt(KEY_KILL_COUNT, 0)
      }
    })
  })
})()



;(() => {
// =========================================================
// 任务：纳吉尔法之役_2
// 规则：
// - 玩家当时严格在同一艘船上（strict）
// - 飞艇 Y > 100（使用 ship position）
// - 累计击杀50个僵尸、骷髅50
// =========================================================
  const TASK_ID = '565825E0EEFFA039'
  const REQUIRED_KILLS = 50 // 需要击杀的数量

  // 目标生物（按需要增删，写 entity type id）
  // 例：'minecraft:zombie', 'minecraft:skeleton', 'alexsmobs:crimson_mosquito' ...
  const TARGET_TYPES = [
    'minecraft:skeleton',
    // 'minecraft:zombie',
  ]

  // 计数键（持久化存玩家身上）
  const KEY_KILL_COUNT = 'vs_task_onship_kill_count'

  // =========================
  // 事件：飞艇上击杀特定生物 -> 累加计数
  // =========================
  EntityEvents.death(event => {
    const src = event.source
    if (!src) return

    // 只统计“玩家造成的击杀”（含近战/远程/附魔等，只要 source.player 能拿到）
    const player = src.player
    if (!player) return

    const target = event.entity
    if (!target) return

    // 目标类型过滤
    const typeId = String(target.type) // KubeJS 通常能转成 'minecraft:zombie' 这种
    if (!TARGET_TYPES.includes(typeId)) return

    // 必须在飞艇/船上（严格）
    if (!VS.js().isPlayerOnShipStrict(player)) return

    // 累加计数（int）
    const cur = player.persistentData.getInt(KEY_KILL_COUNT)
    player.persistentData.putInt(KEY_KILL_COUNT, cur + 1)
  })

  // =========================
  // FTB Quests：读取计数 -> 推进进度 -> 达标完成
  // =========================
  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = REQUIRED_KILLS
    event.setCheckTimer(20) // 每秒检查一次

    event.setCheck((task, player) => {
      const cur = player.persistentData.getInt(KEY_KILL_COUNT)

      // 进度按当前击杀数推进（上限 REQUIRED_KILLS）
      task.progress = Math.min(cur, REQUIRED_KILLS)

      // 可选：如果你希望完成后把计数清掉，避免后续重复利用旧计数
      if (cur >= REQUIRED_KILLS) {
        // 完成后清零（如果你想“永久累计不清零”，就删掉这两行）
        player.persistentData.putInt(KEY_KILL_COUNT, 0)
      }
    })
  })
})()



// =========================================================
// 任务：扩展甲板
// 规则：
// - 计算玩家飞艇体积，并实时映射至customTask，达到即任务完成。
// - 满足一次即完成
// =========================================================

;(() => {
  const TASK_ID = '3A76D2672F2DF0D2'
  const CHECK_TIMER_TICKS = 60
  const MIN_Y = 200

  const MIN_X = 128
  const MIN_Z = 128
  const HEIGHT_CAP = 128   // 超过就不计（或直接判失败）

  // 进度目标：把 X、Z 两项拼成线性目标（也可 +HEIGHT_CAP）
  const TARGET_PROGRESS = MIN_X + MIN_Z

  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = TARGET_PROGRESS
    event.setCheckTimer(CHECK_TIMER_TICKS)

    event.setCheck((task, player) => {
      const ship = VS.js().getShipPlayerIsOnStrict(player)
      if (!ship) { task.progress = 0; return }

      const sp = VS.js().getShipPosition(ship)
      if (!sp) { task.progress = 0; return }
      const shipY = Number(sp[1])
      if (!isFinite(shipY) || shipY <= MIN_Y) { task.progress = 0; return }

      const aabb = ship.getShipAABB()
      if (!aabb) { task.progress = 0; return }

      const dx = Number(aabb.maxX() - aabb.minX() + 1)
      const dy = Number(aabb.maxY() - aabb.minY() + 1)
      const dz = Number(aabb.maxZ() - aabb.minZ() + 1)
      if (!isFinite(dx) || !isFinite(dy) || !isFinite(dz)) { task.progress = 0; return }

      // 高度上限：防堆塔
      if (dy > HEIGHT_CAP) { task.progress = 0; return }

      // 进度：X、Z 线性累计（直观且平滑）
      const px = Math.min(dx, MIN_X)
      const pz = Math.min(dz, MIN_Z)
      task.progress = Math.floor(px + pz)
    })
  })
})()
