Skip to content

交互点配置

交互点是地牢中可以触发特定脚本的位置或条件,支持多种交互方式。

常见用途:

  • 宝箱系统(右键打开,获得奖励)
  • 机关按钮(激活/关闭障碍物)
  • 压力板陷阱(踩踏触发伤害)
  • 区域触发(进入区域执行脚本)
  • NPC对话(右键实体交互)

前置要求:

  • 需要在游戏内使用交互点编辑器设置位置
  • 脚本需要在 interacts.yml 中编辑

交互类型说明

交互点支持 7 种交互类型:

类型说明适用场景
RIGHT_CLICK_BLOCK右键点击方块宝箱、按钮、NPC石像
LEFT_CLICK_BLOCK左键点击方块隐藏机关、破坏触发
BREAK_BLOCK破坏方块特殊矿石、障碍清除
PLACE_BLOCK放置方块能量核心激活、解谜
STEP_ON踩踏方块压力板、陷阱触发
ENTER_REGION进入区域区域陷阱、Boss战触发
RIGHT_CLICK_ENTITY右键实体NPC对话、商人

示例1:RIGHT_CLICK_BLOCK - 宝箱系统

右键打开宝箱,获得奖励(只能触发一次)。

yaml
interacts:
  宝箱_1:
    type: "RIGHT_CLICK_BLOCK"
    once: true  # 只能触发一次
    
    parameters:
      location: "20,64,15"
      required_item: "TRIPWIRE_HOOK"  # 需要手持金钥匙
      fail_message: "&c需要金钥匙才能打开宝箱!"
    
    triggered_message: "&c这个宝箱已经被打开了"
    
    script: |-
      action.message('@trigger', '&a&l你打开了宝箱!')
      action.sound('@trigger', 'BLOCK_CHEST_OPEN', 1.0, 1.0)
      action.effect('VILLAGER_HAPPY', '20,64,15', 30, 0.5, 0.3)
      
      action.give_item('@trigger', 'DIAMOND', 5)
      action.give_item('@trigger', 'GOLDEN_APPLE', 3)
      action.message('@trigger', '&7获得: &e5个钻石, 3个金苹果')

示例2:RIGHT_CLICK_BLOCK - 机关按钮

按下按钮临时移除障碍物。

yaml
interacts:
  机关按钮:
    type: "RIGHT_CLICK_BLOCK"
    once: false  # 可重复触发
    
    parameters:
      location: "5,64,10"
    
    triggered_message: ""  # 留空不显示
    
    script: |-
      action.message('@trigger', '&e你按下了机关按钮')
      action.sound('@all', 'BLOCK_STONE_BUTTON_CLICK_ON', 1.0, 1.0)
      
      action.delete_obstacle('出生点屏障')
      action.message('@all', '&a屏障已解除,10秒后恢复')
      
      action.wait('10秒')
      action.message('@all', '&c屏障即将恢复...')
      action.wait('2秒')
      action.create_obstacle('出生点屏障')

示例3:PLACE_BLOCK - 能量核心激活

放置钻石块激活能量核心。

yaml
interacts:
  能量核心:
    type: "PLACE_BLOCK"
    once: true
    
    parameters:
      location: "0,64,-10"
      required_block: "DIAMOND_BLOCK"  # 需要放置钻石块
      fail_message: "&c需要放置钻石块才能激活能量核心!"
    
    triggered_message: "&c能量核心已经被激活过了"
    
    script: |-
      action.message('@trigger', '&a&l你激活了能量核心!')
      action.title('@all', '&a能量核心激活', '&7障碍已解除')
      action.sound('@all', 'BLOCK_BEACON_POWER_SELECT', 1.0, 1.2)
      
      playVictoryEffects('0,64,-10')
      
      action.wait('2秒')
      action.delete_obstacle('Boss房大门')
      action.message('@all', '&eBoss房大门已开启!')

示例4:STEP_ON - 压力板陷阱

踩踏压力板触发陷阱。

yaml
interacts:
  陷阱_1:
    type: "STEP_ON"
    once: false  # 可重复触发
    
    parameters:
      location: "15,64,10"
    
    triggered_message: ""
    
    script: |-
      action.sound('@trigger', 'ENTITY_CREEPER_PRIMED', 1.0, 0.8)
      action.message('@trigger', '&c&l你触发了陷阱!')
      action.title('@trigger', '&c危险', '&7快速逃离')
      
      action.damage('@trigger', 5.0)
      action.velocity('@trigger', 0.0, 0.8, 0.0)  # 向上弹起

示例5:ENTER_REGION - 区域陷阱

进入区域触发岩浆陷阱。

yaml
interacts:
  陷阱区域:
    type: "ENTER_REGION"
    once: false
    
    parameters:
      min: "-15,63,-15"
      max: "-10,68,-10"
    
    triggered_message: ""
    
    script: |-
      action.message('@trigger', '&c&l你触发了陷阱!')
      action.title('@trigger', '&c危险', '&7小心岩浆')
      action.sound('@trigger', 'ENTITY_ELDER_GUARDIAN_CURSE', 1.0, 0.8)
      
      action.create_obstacle('岩浆陷阱')
      
      action.wait('10秒')
      action.delete_obstacle('岩浆陷阱')

示例6:BREAK_BLOCK - 神秘矿石

破坏特殊矿石获得奖励。

yaml
interacts:
  神秘矿石:
    type: "BREAK_BLOCK"
    once: false
    
    parameters:
      location: "25,60,20"
      required_item: "DIAMOND_PICKAXE"  # 需要钻石镐
      fail_message: "&c需要钻石镐才能开采这个矿石"
    
    triggered_message: ""
    
    script: |-
      action.effect('FIREWORK', '25,60,20', 20, 1.0, 0.5)
      action.sound('@trigger', 'ENTITY_EXPERIENCE_ORB_PICKUP', 1.0, 1.2)
      action.give_item('@trigger', 'EMERALD', 3)
      action.message('@trigger', '&a获得了 3 个绿宝石!')

示例7:RIGHT_CLICK_ENTITY - NPC商人

右键NPC触发对话和交易。

yaml
interacts:
  神秘商人:
    type: "RIGHT_CLICK_ENTITY"
    once: false

    parameters:
      entity_type: "VILLAGER"
      entity_name: "&6神秘商人"
      location: "-8,64,0"

    triggered_message: ""

    script: |-
      action.message('@trigger', '&e[商人] &7你好,冒险者!')
      action.message('@trigger', '&e[商人] &7需要一些补给吗?')
      action.sound('@trigger', 'ENTITY_VILLAGER_YES', 1.0, 1.0)

      action.give_item('@trigger', 'COOKED_BEEF', 8)
      action.give_item('@trigger', 'ARROW', 32)
      action.message('@trigger', '&7获得: &e8个熟牛肉, 32支箭')

示例8:RIGHT_CLICK_BLOCK - 箱子奖励UI 🆕

右键打开箱子时显示奖励选择界面,让玩家自己选择想要的奖励。

功能说明:

  • 玩家打开箱子后看到一个UI界面
  • 可以从多个奖励中选择一个
  • 支持完全自定义UI样式
  • 防止重复领取
yaml
interacts:
  reward_chest_1:
    type: "RIGHT_CLICK_BLOCK"
    once: true  # 每个玩家只能打开一次

    parameters:
      location: "15,64,0"
      block_type: "CHEST"  # 可选:限定必须是箱子方块

    triggered_message: "&c你已经打开过这个宝箱了"

    script: |-
      action.message('@trigger', '&a&l你打开了宝箱!')
      action.sound('@trigger', 'BLOCK_CHEST_OPEN', 1.0, 1.0)
      action.effect('VILLAGER_HAPPY', '15,65,0', 20, 0.5, 0.3)

      // 打开箱子奖励UI(配置在 chest_rewards.yml)
      action.open_chest_ui('@trigger', 'normal_chest')

配置箱子UI(chest_rewards.yml):

yaml
chests:
  normal_chest:
    title: "&6&l✦ 普通宝箱 ✦"
    rows: 3
    mode: single
    background: BLACK_STAINED_GLASS_PANE

    options:
      - slot: 11
        icon: DIAMOND
        name: "&b钻石礼包"
        lore:
          - "&7包含:"
          - "&8▸ &f钻石 x3"
          - "&8▸ &6金币 +1000"
        reward: "normal_reward"

      - slot: 13
        icon: GOLD_INGOT
        name: "&e金币礼包"
        lore:
          - "&7包含:"
          - "&8▸ &f金锭 x16"
          - "&8▸ &6金币 +2000"
        reward: "gold_pack"

      - slot: 15
        icon: EXPERIENCE_BOTTLE
        name: "&a经验礼包"
        lore:
          - "&7包含:"
          - "&8▸ &a经验 +1000"
        reward: "exp_pack"

更多示例请参考 奖励配置 - 箱子奖励UI系统

示例9:RIGHT_CLICK_BLOCK - Boss战利品宝箱

Boss击杀后出现宝箱,玩家可以选择珍贵的战利品。

yaml
interacts:
  boss_chest:
    type: "RIGHT_CLICK_BLOCK"
    once: true

    parameters:
      location: "0,64,20"

    triggered_message: "&c你已经领取过Boss奖励了"

    script: |-
      action.title('@trigger', '&d&lBOSS战利品', '&7选择你的奖励')
      action.sound('@trigger', 'BLOCK_CHEST_OPEN', 1.0, 0.8)
      action.effect('DRAGON_BREATH', '0,65,20', 30, 1.0, 0.5)

      // 打开Boss战利品UI
      action.open_chest_ui('@trigger', 'boss_chest')

配置字段说明

交互点基础字段

字段类型必填说明
type字符串交互类型(见交互类型表)
once布尔是否只能触发一次
parameters对象交互参数(根据类型不同而不同)
triggered_message字符串已触发提示(留空则不显示)
script脚本触发时执行的脚本

parameters 字段(按类型)

RIGHT_CLICK_BLOCK / LEFT_CLICK_BLOCK / BREAK_BLOCK / STEP_ON:

字段类型必填说明
location字符串方块坐标 "x,y,z"
required_item字符串需要手持的物品材料名
fail_message字符串条件不满足时的提示

PLACE_BLOCK:

字段类型必填说明
location字符串方块坐标 "x,y,z"
required_block字符串需要放置的方块类型
fail_message字符串条件不满足时的提示

ENTER_REGION:

字段类型必填说明
min字符串区域最小坐标 "x,y,z"
max字符串区域最大坐标 "x,y,z"

RIGHT_CLICK_ENTITY:

字段类型必填说明
entity_type字符串实体类型(VILLAGER, ARMOR_STAND等)
entity_name字符串实体显示名称
location字符串实体坐标 "x,y,z"

游戏内编辑

  1. 使用"交互点编辑器"(编辑工具栏槽位3)
  2. 左键点击方块 设置交互位置
  3. 选择交互类型
  4. 配置物品条件(可选)
  5. 保存配置
  6. interacts.yml 中编辑脚本

注意

  • 编辑器只记录位置和类型,脚本需要在配置文件中手动编辑
  • triggered_message 留空则不显示"已触发"提示
  • 使用 /dga reload 重载配置

常见问题

Q: 交互点不触发?

  • 检查 typeparameters 配置是否正确
  • 确认坐标位置无误
  • 查看控制台是否有脚本错误

Q: 如何限制只触发一次?

  • 设置 once: true
  • 触发后会显示 triggered_message(如果配置了)

Q: 如何实现需要特定物品才能触发?

  • 使用 required_itemrequired_block 参数
  • 配置 fail_message 提示玩家

Q: ENTER_REGION 区域如何设置?

  • 使用 Shift+右键进入区域选择模式
  • 左键点击设置两个角点
  • 区域会自动计算 min 和 max 坐标

基于 MIT 许可发布