• 欢迎来到Minecraft插件百科!
  • 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
  • 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289

QuestCreator/创建任务

来自Minecraft插件百科
跳转至: 导航搜索

创建任务

提醒 (十分重要 !)

  • 这个页面解释了如何配置任务文件. 即使你打算使用游戏内的任务编辑器,你也最好阅读以下内容以便于了解插件的运行方式和任务文件的结构.

每个玩家的任务都可以不同 ! 自从 QuestCreator v4版本后, 你可以编写 :

  • 每一个 任务设置、分支、目标、条件、地点、方块、材料等, 可以是 "raw" 数值,你也可以设置全局变量({gvariable:global_variable_name}), QuestCreator variables ({variable:variable_name}) 和 PlaceholderAPI 变量 (%my_placeholder%). 变量取决于玩家并会在有需要时被解析. (如果是组队任务则为队长)
  • 比如, 你可以设置 base: world,%player_x%,50,%player_y% 作为地点设置, 或 amount: %heroes_level% 作为数量设置. 同样可用于 goto, 比如 goto: OBJECT {variable_goto}goto: QUEST_{variable:mood} !
  • 每个数值选项可以包含数学表达式 {math:[expression]}. 和占位符一起使用效果更佳. 可使用 +, -, *, /, sin, cos(), tan(), log(), ceil(), floor() 和括号. 比如, amount: %heroes_level% * (5 + log(10^3)).
  • 每个设置可以包含多个权限条件, 比如 {permission:my_permission,value_if_has,value_if_hasnt}. 结果取决于玩家的权限 : 如果玩家拥有特定权限, 将采用第一个数值,无权限则使用第二个数值. 这两个数值可以加入占位符 !
  • 实时解析, 并且缓存可以减少占用服务器资源. Plus, objects goals are parsed when they begin (will not change until completion).
  • The type: ... settings for objects, conditions and activators are the only settings that can NOT contain variables and will NOT be parsed.

---正如主页所写, 你的所有任务的配置位于 /plugins/QuestCreator/quests/. 任何你在该文件夹内创建的.yml文件会被视为是任务文件, (你可以随意创建子文件夹来分类任务). 没有(.yml)后缀的文件名就是任务的id,推荐使用纯英文字母. 不能在文件名内使用空格.


示例任务

以下为默认生成的示例任务 (1.13).

#----------------------------------------------------------------------------------------------------
# 任务 'example' (无扩展名的文件名为任务id)
#----------------------------------------------------------------------------------------------------
# 请参考插件的wiki以了解有关如何创建任务的详细信息.
# 配置内的一些提示在wiki内有更加详细的解释.
#----------------------------------------------------------------------------------------------------

# --------------------------------------------------
# 任务设置
# 任务总体参数
# --------------------------------------------------

# 显示设置 (颜色代码可在以下两者使用,但推荐在描述内使用)
name: '{gvariable:quest_example_name}'
description:
  - '&7只是个简单的任务'

# 可同时运行的此任务的最大不同实例数
# 一个实例 = 一个进行中的任务 (2名组队完成这个任务视为一个实例)
# 这是实验性的内容. 如果任务有与NPC有关的任务目标时不推荐设置大于1: SERVER_NPC_DISPLAY_CHANGE
# 和 SERVER_NPC_MOVE. NPC不在客户端, 每个人拥有相同的NPC (Citizens), 因此,如果任务的多个实例同时操作同一个NPC,可能会很混乱.
# 默认值 : 1
max_concurrent_instances: -1

# 如果在开始任务时已达到'max_concurrent_instances'上限是否创建任务等待队列.
max_concurrent_instances_queue: false

# 可一起做任务的玩家数下限和上限
# 默认值 : minimum 1, maximum 1
min_players: 1
max_players: 1

# 玩家可完成任务的最大次数
# 默认值 : 1
max_completions: 1

# 玩家必须在多久内完成任务 (单位为分钟),否则任务失败
# 默认值 : 0 (关闭)
time_limit: 0

# 再次完成任务所需的等待时间 (如果 max_completions大于1则很有用)
# 可用选项 : 'DISABLED', 'ENABLED [minutes amount]', 'ENABLED_SUCCESS [minutes amount]' (只在玩家完成任务后开始冷却)
# 默认值 : DISABLED
cooldown: DISABLED

# 任务进行时显示的消息条
# 默认值 : '&a{quest} &7- Objective : &a{detailed_progression}'
actionbar: '&a{quest} &7- 目标 : &a{detailed_progression}'

# 在任务结束时显示任务成功或失败的消息
# 默认值 : true
send_status_message: true

# 显示任务目标组内的任务目标完成的消息
# 默认值 : true
send_objective_update_message: true

# 任务只能在以下世界开始/进行
# 默认值 : 无 (关闭)
restricted_worlds: []

# 玩家需要这个权限才能介绍任务
# 默认值 : 无 (关闭)
permission: 

# 进行中的任务保存方式
# - ENABLED (在玩家离开服务器或服务器重载、关闭时保存数据)
# - SERVER_EPHEMERIAL (只在玩家离开服务器时保存数据,重启或重载任务进度会丢失)
# - PLAYER_EPHEMERIAL (不保存任何任务数据)
saving: SERVER_EPHEMERIAL

# 是否关联 'GPS' 插件 ?
# 默认值 : true (只在安装该插件后有用)
gps_enable: true

# 是否关联 'Dynmap' 插件 ?
# 默认值 : null (disabled)
dynmap_marker_location: null

# --------------------------------------------------
# GUI菜单
# 菜单物品配置
# --------------------------------------------------

gui:
  # item_available : 有可接受的任务的物品图标
  item_available:
    type: DIAMOND_SWORD
    name: '&a{name} &a- 可接受'
    lore:
      - '&7{description}'
      - '&b右击接受任务'
  # item_available_category : 有可接受的任务的物品图标 (任务类型菜单)
  item_available_category:
    type: DIAMOND_SWORD
    name: '&a{name} &a- 可接受'
    lore:
      - '&7{description}'
      - '&b右击接受任务'
  # item_progress : 任务状态为 '进行中'
  item_progress:
    type: DIAMOND_SWORD
    name: '&6{name} &6- 进行中'
    lore:
      - '&7{description}'
      - '{detailed_progression}'
  # item_cooldown :任务完成后且玩家未达到max_completions的上限、冷却未结束
  item_cooldown:
    type: DIAMOND_SWORD
    name: '&8{name} &8- 冷却中'
    lore:
      - '&7{description}'
      - '&7You choose to call yourself {variable:example_nickname}. Noice.'
      - '&7&l你已经完成了这个任务 {completions} 次{plural}.'
      - '&7&l你需要等待{cooldown} 才能再次接受这个任务.'
  # item_completed : 任务状态为已完成并且玩家达到了max_completions最大完成次数的上限时显示
  item_completed:
    type: DIAMOND_SWORD
    name: '&8{name} &8- 已完成'
    lore:
      - '&7{description}'
      - '&7You choose to call yourself {variable:example_nickname}. Noice.'
      - '&7&l你已经完成了这个任务 {completions} 次{plural}.'
  # item_unavailable : 不满足任务条件时显示 (model validity, follow check, max players, max instances, 权限、世界、开始条件等 ...)
  item_unavailable:
    type: DIAMOND_SWORD
    name: '&8{name} &8- 无法接受'
    lore:
      - '&7{description}'
      - '&c你不能接受这个任务.'
      - '&c{detailed_errors}'

# --------------------------------------------------
# 开始任务的条件
# 
# --------------------------------------------------

start_conditions:
  1:
    type: MONEY
    amount: '{gvariable:quest_example_moneyneeded}'
    take_after_check: true
    error_message: '&2[示例任务] &a抱歉, 你的钱不够,你无法接受这个任务. 你需要{gvariable:quest_example_moneyneeded}$ !'

# --------------------------------------------------
# 任务分支
# 
# --------------------------------------------------

branches:

  # --------------------------------------------------
  # 这是一个主要分支
  # 每个玩家都必须经过这部分,因为这是任务的开始
  # --------------------------------------------------
  1_start:
    # 分支名称 (可选)
    name: '才刚刚开始呢'
    # 自动在任务开始时开始以作为主要分支
    auto_start: true
    # 这个分支在名为 1_START 的目标开始时开始
    starts_at: 1_START
    # 目标 (分支内容)
    objects:
    
      # '1_START' : 开始目标:一些消息
      1_START:
        # 设置
        type: SERVER_ACTION_LIST
        actions:
          - 'SOUND VILLAGER_IDLE'
          - 'MESSAGE &2[示例任务] &7你好, &a{player}&7, 这是一个有多条路线的示例任务 !'
          - 'WAIT 2'
          - 'SOUND VILLAGER_IDLE'
          - 'MESSAGE &2[示例任务] &7kay, 首先我需要你告诉我你的 &a名字 &7.'
        # 结束 : 完成这个目标时, 前往下一个目标
        goto: OBJECT 2_NICKNAME
        
      # '2_NICKNAME' : 询问玩家的名字并存储到变量内
      2_NICKNAME:
        # 开始
        wait: 3
        sound: VILLAGER_IDLE
        message: '&2[示例任务] &7请在聊天框内&b输入你的名字 &7:'
        # 名称
        name: '告诉我你的名字'
        progress_name: '在聊天框内输入你的名字'
        # 设置
        type: PLAYER_CHAT_VARIABLE
        variable: example_nickname
        min_length: 5
        max_length: 25
        disallowed_words:
          - 'umbrella'
          - 'wesh'
          - 'fuck'
        cancel_event: true
        # 结束
        goto: OBJECT 3_SAVELOCATION
        
      # '3_SAVELOCATION' : 保存玩家当前位置到变量内
      3_SAVELOCATION:
        # 设置
        type: SERVER_VARIABLE_CHANGE
        variable: example_player_location
        operation: SET
        value: '{questcreator_player_location}' # 这是一个QuestCreator 的变量, 以以下格式存储地点 : 'world,x,y,z,yaw,pitch'
        # 结束
        goto: OBJECT 4_COBBLESTONE
        
      # '4_COBBLESTONE' : 在指定区域放置10块圆石
      4_COBBLESTONE:
        # 开始
        sound: VILLAGER_IDLE
        message: '&2[示例任务] &7Okay, 不错. &a{variable:example_nickname}&7, 哈? Ill remember it ! Okay, Im gonna need you to &bplace 10 cobblestone blocks&7. Also, &bremember where youre located&7, I might ask you to go back there at the end.'
        # 名称
        name: '大展身手'
        progress_name: '放置圆石'
        # 设置
        type: PLAYER_BLOCK_PLACE
        block:
          type: COBBLESTONE
          amount: 10
        # 结束
        post_message: '&2[示例任务] &7恭喜 &a{variable:example_nickname} &7! 你成功地放置了圆石!'
        post_sound: VILLAGER_IDLE
        goto: OBJECT 5_CHOICE
        
      # '5_CHOICE' : 让玩家作出选择
      5_CHOICE:
        # pre (等待3秒)
        wait: 3
        message: '&2[示例任务] &7选择接下来你想做什么吧.'
        sound: VILLAGER_IDLE
        # 名称
        name: '抉择'
        progress_name: '抉择'
        # 设置
        type: DIVERGE
        repeat_delay: 30
        choices:
          1:
            text: '&7我选择生火.'
            redo_text: '&8(我选择生火.)'
            goto: BRANCH 2_1_fire
          2:
            text: '&7我选择建筑.'
            redo_text: '&8(我选择建筑)'
            goto: BRANCH 2_2_build
          3:
            text: '&7我选择止步于此. 我认为我很厉害.'
            redo_text: '&8(我选择止步于此. 我认为我很厉害.)'
            goto: QUEST_SUCCESS
          4:
            text: '&7我选择止步于此. 我觉得我做得不够好,我需要再来一次.'
            redo_text: '&8(我选择止步于此. 我觉得我做得不够好,我需要再来一次.)'
            goto: QUEST_FAIL

  # --------------------------------------------------
  # 生火分支 (这一分支不会自动开始)
  # --------------------------------------------------
  2_1_fire:
    # 设置
    name: 'Destruction'
    auto_start: false
    starts_at: 1_GIVE
    # 目标
    objects:
    
      # '1_GIVE' : 给予玩家打火石
      1_GIVE:
        # 设置
        type: SERVER_ITEMS_GIVE
        items:
          1:
            type: FLINT_AND_STEEL
            enchants:
              - DURABILITY,5
        # 结束
        goto: OBJECT 2_FIRE
        
      # '2_FIRE' : 把圆石丢入火中
      2_FIRE:
        # pre
        message: '&2[示例任务] &7Okay. 很暴力. 不错,继续, &bput 5 of those cobblestones in fire&7.'
        sound: VILLAGER_IDLE
        # 名称
        name: '烧掉这些石头'
        progress_name: '烧掉这些石头'
        # 设置
        type: PLAYER_BLOCK_FIRE
        block:
          type: COBBLESTONE
          amount: 5
        # 结束
        goto: OBJECT 3_GOBACK
        
      # '3_GOBACK' : 玩家必须回到原来的地方
      3_GOBACK:
        # pre
        message: '&2[示例任务] &7干得漂亮. 还记得我教你怎么回去吗?&b回到那里&7.'
        sound: VILLAGER_IDLE
        # 名称
        name: '回到你曾经的地方'
        progress_name: '回到你曾经的地方'
        # 设置
        type: PLAYER_WALK
        walk_type: WALK_TO
        location:
          base: '{variable:example_player_location}'
        # 结束
        goto: OBJECT 4_DROPMIC_PRE
        
      # '4_DROPMIC_PRE' 和 '5_DROPMIC' : 丢掉打火石
      4_DROPMIC_PRE:
        # 设置 - 触发可选分支发送提示给玩家让其丢掉打火石
        type: SERVER_ACTION_LIST
        actions:
          - 'STARTBRANCH 2_1_fire_hint'
          - 'SOUND VILLAGER_IDLE'
          - 'MESSAGE &2[示例任务] &7是时候 &b丢掉打火石了&7,不是吗?'
        # 结束 - 开始真正的目标
        goto: OBJECT 5_DROPMIC
        
      5_DROPMIC:
        # 名称
        name: '丢掉打火石'
        progress_name: '丢掉打火石'
        # 设置
        type: PLAYER_ITEM_DROP
        item:
          type: FLINT_AND_STEEL
          enchants:
            - DURABILITY,5
          remove_after_action: true
        # 结束
        post_message: '&2[示例任务] &7你没有完成任务, &c{variable:example_nickname}&7. 因此你不会获得任何奖励.'
        post_sound: VILLAGER_IDLE
        goto: QUEST_SUCCESS
  
  # 这一分支将在有需要时给予玩家提示
  2_1_fire_hint:
    auto_start: false
    starts_at: HINTS
    objects:
      HINTS:
        # 设置
        type: SERVER_ACTION_LIST
        actions:
          - 'WAIT 5'
          - 'MESSAGE &2[示例任务] &7*hmhm* 请丢掉打火石.'
          - 'WAIT 5'
          - 'MESSAGE &2[示例任务] &7我再说一遍... &l请丢掉&7打火石.'
          - 'WAIT 5'
          - 'MESSAGE &2[示例任务] &7请丢掉你手上的打火石...'
        # no goto here, just let the branch end
  
  # --------------------------------------------------
  # 建筑分支 (这一分支不会自动开始)
  # --------------------------------------------------
  2_2_build:
    # 设置
    name: '创造'
    auto_start: false
    starts_at: 1_GIVE
    # Objects
    objects:
    
      # '1_GIVE' : 给予玩家所需木头 (5x 64 原木)
      1_GIVE:
        # 设置
        type: SERVER_ITEMS_GIVE
        items:
          1:
            type: ACACIA_LOG
            amount: 64
        amount: 5
        # 结束
        goto: OBJECT 2_BUILD_GROUP
        
      # '2_BUILD_GROUP' : 包含所有建筑目标的组
      2_BUILD_GROUP:
        # pre
        message: '&2[示例任务] &7不错的选择, &a{variable:example_nickname}&7. 建造一个有天窗的小房子怎么样? 我不会检测你有没有造好, 请你加油吧! :)'
        # 名称
        name: '建筑练习'
        # 设置
        type: GROUP
        group_type: ALL_OBJECTS
        group_objects:
          - '2_1_CRAFT'
          - '2_2_BUILD'
          - '2_3_BUILD'
        # 结束
        goto: OBJECT 3_GOBACK
        
      # 这些是组内的目标, 所有目标都需要完成.顺序无所谓.
      2_1_CRAFT:
        # 名称
        progress_name: '合成木板'
        # 设置
        type: PLAYER_ITEM_CRAFT
        item:
          type: ACACIA_PLANKS
          amount: 64
      2_2_BUILD:
        # 名称
        progress_name: '放置木板'
        # 设置
        type: PLAYER_BLOCK_PLACE
        block:
          type: ACACIA_PLANKS
          amount: 32
      2_3_BUILD:
        # 名称
        progress_name: '放置台阶'
        # 设置
        type: PLAYER_BLOCK_PLACE
        block:
          type: ACACIA_SLAB
          amount: 10
        
      # '3_GOBACK' : 玩家必须回到原来的地方
      3_GOBACK:
        # pre
        message: '&2[示例任务] &7干得好. 还记得我教你怎么回去吗?&b回去吧&7.'
        sound: VILLAGER_IDLE
        # 名称
        name: '回到你原来的地方'
        progress_name: '回到你原来的地方'
        # 设置
        type: PLAYER_WALK
        walk_type: WALK_TO
        location:
          base: '{variable:example_player_location}'
          near: 5.0
        # 结束
        goto: OBJECT 4_REFUND
      
      # '4_REFUND' : 返回开始任务所扣的钱
      4_REFUND:
        # pre
        message: '&2[示例任务] &7不错的房子. 继续建筑吧! 我十分想看到你的杰作,可我只是荒野之声, 但我确认你建得一定很好. 拿回你的钱吧, 你的建筑比这更值钱!'
        # 设置
        type: SERVER_MONEY_CHANGE
        operation: ADD
        amount: '{gvariable:quest_example_moneyneeded}'
        # 结束
        goto: QUEST_SUCCESS

  # --------------------------------------------------
  # 森林里的另一个分支
  # --------------------------------------------------
  3_secret_forest:
    # 设置
    name: '森林里有些东西'
    auto_start: true
    starts_at: A_1
    # Objects
    objects:
      # 'A_1' : 触发器
      A_1:
        # pre
        wait: 15
        message: '&2[示例任务] &7顺便一说,我只是告诉你,你可以做更多事情...'
        # 名称
        name: '森林探险'
        # 设置
        type: PLAYER_BLOCK_BREAK
        block:
          type: ACACIA_LOG
          amount: 1
        # goto
        goto: OBJECT A_2
      
      # 'A_2' : 结束
      A_2:
        # pre
        message: '&2[示例任务] &a恭喜你完成了隐藏任务! 你发现了这个, 你可以合成工作台了.'
        sound: VILLAGER_IDLE
        # 名称
        name: '合成工作台'
        progress_name: '合成工作台'
        # 设置
        type: PLAYER_ITEM_CRAFT
        item:
          type: WORKBENCH
          amount: 1
        # post
        post_message: '&2[示例任务] &a完成! 但是你这么做并没有任务奖励!'
        post_sound: VILLAGER_IDLE

  # --------------------------------------------------
  # 洞穴内的另一个分支
  # --------------------------------------------------
  3_secret_cave:
    # 设置 (因为这是隐藏分支所有没有名称)
    auto_start: true
    starts_at: A_1
    # Objects
    objects:
      # 'A_1' : 触发器
      A_1:
        # 设置
        type: PLAYER_BLOCK_BREAK
        block:
          type: IRON_ORE
          amount: 10
        # 结束
        goto: OBJECT A_2
      
      # 'A_2' : 结束
      A_2:
        # pre
        message: '&2[示例任务] &a你挖了10个铁矿,拿着,这是你应得的.'
        sound: ORB_PICKUP
        # 设置
        type: SERVER_MONEY_CHANGE
        operation: ADD
        amount: 50

# --------------------------------------------------
# 成功目标
# 在玩家任务成功时执行
# (只支持服务器目标)
# --------------------------------------------------

success_objects:
  '1':
    type: SERVER_FIREWORK_SPAWN
    location:
      player_relative_base:
        horizontal_angle: 0.0
        vertical_offset: 1.0
        distance: 2.5
        random_player: false

# --------------------------------------------------
# 失败目标
# 在玩家任务失败时执行
# (只支持服务器目标)
# --------------------------------------------------

fail_objects:
  '1':
    type: SERVER_PLAYER_DAMAGE
    amount: 0.1