// =========================================================
// 任务：在船上放置指定方块后完成 甲板灶火
// 规则：
// - 只有当“该方块被放置在某艘船体管理范围内” 且 “玩家当时严格站在同一艘船上” 才算数
// - 满足一次即完成
// =========================================================

;(() => {
  const TASK_ID = '4B3AAD291C5824A2'
  const TARGET_BLOCK_ID = 'farmersdelight:stove' // 改成你要的方块
  const CHECK_TIMER_TICKS = 20 // 1s监听间隔Tick
  const MIN_Y = 100  //高度限制

  const KEY_DONE = `vs_place_done_${TASK_ID}`
  const KEY_SHIP = `vs_place_ship_${TASK_ID}`

  // -------------------------------
  // 1) 监听放置方块：满足条件就打标记
  // -------------------------------
  BlockEvents.placed(event => {
    const player = event.player
    if (player == null) return
    if (player.level.isClientSide()) return

    const placedId = String(event.block.id)
    if (placedId !== TARGET_BLOCK_ID) return

    const level = event.level
    const pos = event.block.pos // BlockPos
    if (pos.y <= MIN_Y) return

    // A) 这个方块是否“属于某艘船”（即被某艘船管理）
    //    用 XYZ 版本更稳，避免 BlockPos 侧类型坑
    const shipOfBlock = VS.js().getShipManagingBlockXYZ(
      level,
      pos.x, pos.y, pos.z
    )
    if (shipOfBlock == null) return

    // B) 玩家当时是否“严格在船上”
    const shipOfPlayer = VS.js().getShipPlayerIsOnStrict(player)
    if (shipOfPlayer == null) return

    // C) 必须是同一艘船
    const sidA = '' + shipOfBlock.id
    const sidB = '' + shipOfPlayer.id
    if (sidA !== sidB) return

    // D) 高度判定：用飞艇的世界坐标 Y（而不是方块 pos.y）
    const shipPos = VS.js().getShipPosition(shipOfPlayer)
    if (shipPos == null) return

    const shipY = Number(shipPos[1])
    if (!isFinite(shipY)) return
    if (shipY <= MIN_Y) return


    // 达成：写标记
    player.persistentData.putString(KEY_DONE, '1')
    player.persistentData.putString(KEY_SHIP, sidA)

    // 可选：提示
    // player.tell(`§a[vsjsv2] 放置成功：${TARGET_BLOCK_ID} @ ship ${sidA}`)
  })

  // --------------------------------
  // 2) FTBQ 自定义任务：检测标记并完成
  // --------------------------------
  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = 1
    event.setCheckTimer(CHECK_TIMER_TICKS)

    event.setCheck((task, player) => {
      const done = (player.persistentData.getString(KEY_DONE) || '') === '1'
      if (!done) {
        task.progress = 0
        return
      }

      task.progress = 1

      // 可选：完成后清理标记（避免以后重复触发/调试污染）
      // 注意：有些版本 FTBQ 在完成瞬间会重复调用 setCheck，多清一次没问题
      player.persistentData.remove(KEY_DONE)
      player.persistentData.remove(KEY_SHIP)
    })
  })
})()



// =========================================================
// 任务：主手手持指定物品，右键指定方块后完成 空中备餐
// 额外限制：
// - 必须严格在船上（strict）
// - 使用飞艇Y坐标判定：shipY > 100
// - 满足一次即完成
// =========================================================

;(() => {
  const TASK_ID = '749E0C1BC2FF1E6D'
  const REQUIRED_SUFFIX = '_knife'               // 主手物品
  const TARGET_BLOCK_ID = 'farmersdelight:cutting_board'    // 被右键方块
  const CHECK_TIMER_TICKS = 20

  const MIN_Y = 100

  const KEY_DONE = `vs_use_done_${TASK_ID}`
  const KEY_SHIP = `vs_use_ship_${TASK_ID}`

  // -------------------------------
  // 1) 监听右键方块
  // -------------------------------
  BlockEvents.rightClicked(event => {
    const player = event.player
    if (player == null) return
    if (player.level.isClientSide()) return

    // A) 必须主手
    if (String(event.hand) !== 'MAIN_HAND') return

    // B) 目标方块判定
    const blockId = String(event.block.id)
    if (blockId !== TARGET_BLOCK_ID) return

    // C) 主手物品判定
    const main = player.getMainHandItem()
    const itemId = String(main.id)
    if (!itemId.endsWith(REQUIRED_SUFFIX)) return

    // D) 必须严格在船上（并取到玩家所在船）
    const ship = VS.js().getShipPlayerIsOnStrict(player)
    if (ship == null) return

    // E) 飞艇Y坐标 > MIN_Y（用 ship position）
    const shipPos = VS.js().getShipPosition(ship)
    if (shipPos == null) return

    const shipY = Number(shipPos[1])
    if (!isFinite(shipY)) return
    if (shipY <= MIN_Y) return

    // 达成：写标记
    const sid = '' + ship.id
    player.persistentData.putString(KEY_DONE, '1')
    player.persistentData.putString(KEY_SHIP, sid)

    // player.tell(`§a完成交互：shipY=${shipY.toFixed(2)} ship=${sid}`)
  })

  // --------------------------------
  // 2) FTBQ 自定义任务：检测标记并完成
  // --------------------------------
  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = 1
    event.setCheckTimer(CHECK_TIMER_TICKS)

    event.setCheck((task, player) => {
      const done = (player.persistentData.getString(KEY_DONE) || '') === '1'
      if (!done) { task.progress = 0; return }

      task.progress = 1

      // 清理标记
      player.persistentData.remove(KEY_DONE)
      player.persistentData.remove(KEY_SHIP)
    })
  })
})()



// =========================================================
// 任务：在船上放置指定方块后完成 蒸汽烹饪
// 规则：
// - 只有当“该方块被放置在某艘船体管理范围内” 且 “玩家当时严格站在同一艘船上” 才算数
// - 满足一次即完成
// =========================================================

;(() => {
  const TASK_ID = '0419379F986DE130'
  const TARGET_BLOCK_ID = 'farmersdelight:cooking_pot' // 改成你要的方块
  const CHECK_TIMER_TICKS = 20 // 1s监听间隔Tick
  const MIN_Y = 100  //高度限制

  const KEY_DONE = `vs_place_done_${TASK_ID}`
  const KEY_SHIP = `vs_place_ship_${TASK_ID}`

  // -------------------------------
  // 1) 监听放置方块：满足条件就打标记
  // -------------------------------
  BlockEvents.placed(event => {
    const player = event.player
    if (player == null) return
    if (player.level.isClientSide()) return

    const placedId = String(event.block.id)
    if (placedId !== TARGET_BLOCK_ID) return

    const level = event.level
    const pos = event.block.pos // BlockPos
    if (pos.y <= MIN_Y) return

    // A) 这个方块是否“属于某艘船”（即被某艘船管理）
    //    用 XYZ 版本更稳，避免 BlockPos 侧类型坑
    const shipOfBlock = VS.js().getShipManagingBlockXYZ(
      level,
      pos.x, pos.y, pos.z
    )
    if (shipOfBlock == null) return

    // B) 玩家当时是否“严格在船上”
    const shipOfPlayer = VS.js().getShipPlayerIsOnStrict(player)
    if (shipOfPlayer == null) return

    // C) 必须是同一艘船
    const sidA = '' + shipOfBlock.id
    const sidB = '' + shipOfPlayer.id
    if (sidA !== sidB) return

    // D) 高度判定：用飞艇的世界坐标 Y（而不是方块 pos.y）
    const shipPos = VS.js().getShipPosition(shipOfPlayer)
    if (shipPos == null) return

    const shipY = Number(shipPos[1])
    if (!isFinite(shipY)) return
    if (shipY <= MIN_Y) return


    // 达成：写标记
    player.persistentData.putString(KEY_DONE, '1')
    player.persistentData.putString(KEY_SHIP, sidA)

    // 可选：提示
    // player.tell(`§a[vsjsv2] 放置成功：${TARGET_BLOCK_ID} @ ship ${sidA}`)
  })

  // --------------------------------
  // 2) FTBQ 自定义任务：检测标记并完成
  // --------------------------------
  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = 1
    event.setCheckTimer(CHECK_TIMER_TICKS)

    event.setCheck((task, player) => {
      const done = (player.persistentData.getString(KEY_DONE) || '') === '1'
      if (!done) {
        task.progress = 0
        return
      }

      task.progress = 1

      // 可选：完成后清理标记（避免以后重复触发/调试污染）
      // 注意：有些版本 FTBQ 在完成瞬间会重复调用 setCheck，多清一次没问题
      player.persistentData.remove(KEY_DONE)
      player.persistentData.remove(KEY_SHIP)
    })
  })
})()



// =========================================================
// 任务：主手手持指定物品，右键指定方块后完成 空中耕作
// 额外限制：
// - 必须严格在船上（strict）
// - 使用飞艇Y坐标判定：shipY > 100
// - 满足一次即完成
// =========================================================

;(() => {
  const TASK_ID = '121E5EFC40116F61'
  const REQUIRED_SUFFIX = '_hoe'               // 主手物品
  const TARGET_BLOCK_ID = 'minecraft:dirt'    // 被右键方块
  const CHECK_TIMER_TICKS = 20

  const MIN_Y = 100

  const KEY_DONE = `vs_use_done_${TASK_ID}`
  const KEY_SHIP = `vs_use_ship_${TASK_ID}`

  // -------------------------------
  // 1) 监听右键方块
  // -------------------------------
  BlockEvents.rightClicked(event => {
    const player = event.player
    if (player == null) return
    if (player.level.isClientSide()) return

    // A) 必须主手
    if (String(event.hand) !== 'MAIN_HAND') return

    // B) 目标方块判定
    const blockId = String(event.block.id)
    if (blockId !== TARGET_BLOCK_ID) return

    // C) 主手物品判定
    const main = player.getMainHandItem()
    const itemId = String(main.id)
    if (!itemId.endsWith(REQUIRED_SUFFIX)) return

    // D) 必须严格在船上（并取到玩家所在船）
    const ship = VS.js().getShipPlayerIsOnStrict(player)
    if (ship == null) return

    // E) 飞艇Y坐标 > MIN_Y（用 ship position）
    const shipPos = VS.js().getShipPosition(ship)
    if (shipPos == null) return

    const shipY = Number(shipPos[1])
    if (!isFinite(shipY)) return
    if (shipY <= MIN_Y) return

    // 达成：写标记
    const sid = '' + ship.id
    player.persistentData.putString(KEY_DONE, '1')
    player.persistentData.putString(KEY_SHIP, sid)

    // player.tell(`§a完成交互：shipY=${shipY.toFixed(2)} ship=${sid}`)
  })

  // --------------------------------
  // 2) FTBQ 自定义任务：检测标记并完成
  // --------------------------------
  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = 1
    event.setCheckTimer(CHECK_TIMER_TICKS)

    event.setCheck((task, player) => {
      const done = (player.persistentData.getString(KEY_DONE) || '') === '1'
      if (!done) { task.progress = 0; return }

      task.progress = 1

      // 清理标记
      player.persistentData.remove(KEY_DONE)
      player.persistentData.remove(KEY_SHIP)
    })
  })
})()



// =========================================================
// 任务：在船上放置指定方块后完成 喷气动力
// 规则：
// - 只有当“该方块被放置在某艘船体管理范围内” 且 “玩家当时严格站在同一艘船上” 才算数
// - 满足两次即完成
// =========================================================

;(() => {
  const TASK_ID = '70BFAED0B708939D'
  const TARGET_BLOCK_ID = 'createpropulsion:thruster' // 改成你要的方块
  const CHECK_TIMER_TICKS = 20 // 1s监听间隔Tick
  const MIN_Y = 64  //高度限制

  const KEY_DONE = `vs_place_done_${TASK_ID}`
  const KEY_SHIP = `vs_place_ship_${TASK_ID}`

  // -------------------------------
  // 1) 监听放置方块：满足条件就打标记
  // -------------------------------
  BlockEvents.placed(event => {
    const player = event.player
    if (player == null) return
    if (player.level.isClientSide()) return

    const placedId = String(event.block.id)
    if (placedId !== TARGET_BLOCK_ID) return

    const level = event.level
    const pos = event.block.pos // BlockPos
    if (pos.y <= MIN_Y) return

    // A) 这个方块是否“属于某艘船”（即被某艘船管理）
    //    用 XYZ 版本更稳，避免 BlockPos 侧类型坑
    const shipOfBlock = VS.js().getShipManagingBlockXYZ(
      level,
      pos.x, pos.y, pos.z
    )
    if (shipOfBlock == null) return

    // B) 玩家当时是否“严格在船上”
    const shipOfPlayer = VS.js().getShipPlayerIsOnStrict(player)
    if (shipOfPlayer == null) return

    // C) 必须是同一艘船
    const sidA = '' + shipOfBlock.id
    const sidB = '' + shipOfPlayer.id
    if (sidA !== sidB) return

    // D) 高度判定：用飞艇的世界坐标 Y（而不是方块 pos.y）
    const shipPos = VS.js().getShipPosition(shipOfPlayer)
    if (shipPos == null) return

    const shipY = Number(shipPos[1])
    if (!isFinite(shipY)) return
    if (shipY <= MIN_Y) return


    // 达成：写标记
    player.persistentData.putString(KEY_DONE, '1')
    player.persistentData.putString(KEY_SHIP, sidA)

    // 可选：提示
    // player.tell(`§a[vsjsv2] 放置成功：${TARGET_BLOCK_ID} @ ship ${sidA}`)
  })

  // --------------------------------
  // 2) FTBQ 自定义任务：检测标记并完成
  // --------------------------------
  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = 1
    event.setCheckTimer(CHECK_TIMER_TICKS)

    event.setCheck((task, player) => {
      const done = (player.persistentData.getString(KEY_DONE) || '') === '1'
      if (!done) {
        task.progress = 0
        return
      }

      task.progress = 1

      // 可选：完成后清理标记（避免以后重复触发/调试污染）
      // 注意：有些版本 FTBQ 在完成瞬间会重复调用 setCheck，多清一次没问题
      player.persistentData.remove(KEY_DONE)
      player.persistentData.remove(KEY_SHIP)
    })
  })
})()



// =========================================================
// 任务：在船上放置指定方块后完成 锅炉升级
// 规则：
// - 只有当“该方块被放置在某艘船体管理范围内” 且 “玩家当时严格站在同一艘船上” 才算数
// - 满足两次即完成
// =========================================================

;(() => {
  const TASK_ID = '5ECE8BDC7ED95ECA'
  const TARGET_BLOCK_ID = 'createpropulsion:liquid_burner' // 改成你要的方块
  const CHECK_TIMER_TICKS = 20 // 1s监听间隔Tick
  const MIN_Y = 64  //高度限制

  const KEY_DONE = `vs_place_done_${TASK_ID}`
  const KEY_SHIP = `vs_place_ship_${TASK_ID}`

  // -------------------------------
  // 1) 监听放置方块：满足条件就打标记
  // -------------------------------
  BlockEvents.placed(event => {
    const player = event.player
    if (player == null) return
    if (player.level.isClientSide()) return

    const placedId = String(event.block.id)
    if (placedId !== TARGET_BLOCK_ID) return

    const level = event.level
    const pos = event.block.pos // BlockPos
    if (pos.y <= MIN_Y) return

    // A) 这个方块是否“属于某艘船”（即被某艘船管理）
    //    用 XYZ 版本更稳，避免 BlockPos 侧类型坑
    const shipOfBlock = VS.js().getShipManagingBlockXYZ(
      level,
      pos.x, pos.y, pos.z
    )
    if (shipOfBlock == null) return

    // B) 玩家当时是否“严格在船上”
    const shipOfPlayer = VS.js().getShipPlayerIsOnStrict(player)
    if (shipOfPlayer == null) return

    // C) 必须是同一艘船
    const sidA = '' + shipOfBlock.id
    const sidB = '' + shipOfPlayer.id
    if (sidA !== sidB) return

    // D) 高度判定：用飞艇的世界坐标 Y（而不是方块 pos.y）
    const shipPos = VS.js().getShipPosition(shipOfPlayer)
    if (shipPos == null) return

    const shipY = Number(shipPos[1])
    if (!isFinite(shipY)) return
    if (shipY <= MIN_Y) return


    // 达成：写标记
    player.persistentData.putString(KEY_DONE, '1')
    player.persistentData.putString(KEY_SHIP, sidA)

    // 可选：提示
    // player.tell(`§a[vsjsv2] 放置成功：${TARGET_BLOCK_ID} @ ship ${sidA}`)
  })

  // --------------------------------
  // 2) FTBQ 自定义任务：检测标记并完成
  // --------------------------------
  FTBQuestsEvents.customTask(TASK_ID, event => {
    event.maxProgress = 1
    event.setCheckTimer(CHECK_TIMER_TICKS)

    event.setCheck((task, player) => {
      const done = (player.persistentData.getString(KEY_DONE) || '') === '1'
      if (!done) {
        task.progress = 0
        return
      }

      task.progress = 1

      // 可选：完成后清理标记（避免以后重复触发/调试污染）
      // 注意：有些版本 FTBQ 在完成瞬间会重复调用 setCheck，多清一次没问题
      player.persistentData.remove(KEY_DONE)
      player.persistentData.remove(KEY_SHIP)
    })
  })
})()