任务与请求板 [物理经济系列]

任务与请求板 [物理经济系列]

添加了请求和任务板,让玩家可以用材料换取金币奖励。

杂项

任务与请求公告板

任务与请求公告板 是一个 Hytale 模组,它引入了一个结构化的 委托与任务公告板系统,专为 SMP 和 RP 服务器设计。

该模组允许玩家发布带有保证的 金币奖励材料请求,同时管理员可以创建 服务器控制的 任务,所有功能均基于安全、可配置且防利用的经济系统。


🔗 依赖

此模组 需要

  • [Coins & Markets] [物理经济系列]

所有货币处理(铜币/银币/金币/铂金币)、转换和比率都 直接继承 自 Coins & Markets 的配置。


📌 重要提示:

需要明确的是,此模组绝不涉及现实世界的货币。


📌 模组内容

📋 请求公告板(玩家拥有)

一个玩家拥有的公告板,概念上类似于供应商,用于发布材料的 采购订单

借助请求公告板,玩家可以:

  • 创建请求,指定:
    • 请求物品
    • 数量
    • 金币奖励
  • 接受其他玩家的交付
  • 自动支付贡献者
  • 物理存储 中收集已购买的材料

每个公告板包含一个 36 格收件箱(4×9)

  • 所有交付的物品都存储在此处
  • 如果收件箱已满,则阻止交付
  • 没有虚拟物品,也不会丢失物品

🧾 任务公告板(管理员)

一个管理员拥有的公告板,用于发布关于材料的可重复(或不可重复,如果你选择)任务,以换取金币。 每个任务对玩家来说是个人化的,在每个冷却时间内,每个玩家只能完成一个特定的任务一次。

指令任务

当玩家完成特定任务时,服务器可以自动运行一个或多个指令作为奖励/动作。

实际示例(每行写一个指令):

  • console: broadcast {player} 购买了 VIP!
  • console: give {player} Coin_Gold 3
  • console: lp user {player} parent add vip 30d
  • player: give {player} Coin_Silver

规则/提示:

  • 每行一个指令(添加多行以连锁奖励)。
  • 不要包含危险指令(避免 OP/权限升级,除非你真的想这样做)。
  • 先测试,在用于真实奖励之前,先在测试任务公告板上使用一个安全的提议。

💰 安全经济系统(托管账户系统)

所有请求都使用内置的 托管账户系统

  • 金币在 请求创建时被锁定
  • 付款有保证
  • 不会出现诈骗或未付款的交付
  • 所有交易都是 原子性的
    • 要么全部成功,要么什么都不发生

🔁 请求副本与冷却时间

单个请求可以代表 多个相同的副本(例如 10 个任务)。

此外:

  • 每个玩家在每个冷却时间内 只能完成一个副本
  • 适用于:
    • 可重复的委托
    • 分散的劳动
    • 防止单玩家刷取

⚙️ 配置 (权限、配置回退 与 LuckPerms)

任务与请求公告板在首次启动时会创建一个 JSON 配置文件:

  • 文件名: quest_request_boards.json
  • 位置: 模组/插件的 数据目录 内(自动创建)

更改在 服务器重启 后生效(该文件在启动时也会自动进行美观格式化并重新保存)。

▶️ 1) 权限系统概览(你使用的是哪种模式?)

此模组支持 两种不同的访问控制风格

  • 配置回退模式(默认/宽松) 在 LuckPerms 未激活(或权限后端不可用且启用了失败开放)时使用。 在此模式下,模组的行为主要类似于一个 所有权 + 配置规则 系统:
    • 公告板所有者 默认被信任可执行某些操作(例如:取消自己的请求,打开自己的收件箱)。
    • 管理员(OP) 可以绕过大多数限制。
    • 某些操作始终允许所有人执行(例如:完成请求),除非你切换到 LuckPerms 模式。
  • LuckPerms模式(严格/权限驱动) 在启用了 UseLuckPerms 并且 LuckPerms 已安装并可用时使用。 在此模式下,大多数操作由 明确的权限节点 控制:
    • 对于许多操作,仅凭所有权是不够的(例如:所有者需要 ...cancel.own...inbox.open.own 权限)。
    • 非常适合希望实现 基于角色的访问(市民 vs. 商人 vs. 工作人员)的RP/SMP服务器。
    • 如果你希望防止“默认 OP 权力”并完全控制谁能做什么,推荐使用此模式。

提示: 如果你启用了 LuckPerms 模式,记得授予“基本玩家”权限,否则玩家可能能够 看到 公告板,但无法 使用 关键操作,如创建/取消请求或打开收件箱。

▶️ 2) 访问.提供商设置(启用 / LuckPerms / 失败开放 vs 失败关闭)

权限后端由以下配置控制:

"Access": {
  "Provider": {
    "Enabled": true,
    "UseLuckPerms": false,
    "DefaultDenyWhenUnavailable": false
  }
}
  • Access.Provider.Enabled
    • true = 模组评估权限(原生/OP/LuckPerms,取决于其他设置)。
    • false = 忽略权限节点;模组依赖于配置/所有权行为(并在适用情况下使用 OP 绕过)。
  • Access.Provider.UseLuckPerms
    • true = 如果 LuckPerms 已安装并可用,则使用它。
    • false = 使用服务器的原生权限(和 OP 支持)。
  • Access.Provider.DefaultDenyWhenUnavailable: 控制在外部权限后端不可用时发生的情况:
    • false(失败开放):模组回退到 配置/所有权规则,以便你的服务器保持运行。
    • true(失败关闭):模组变得 严格,如果外部后端不可用,将拒绝大多数受权限控制的操作。

日志记录:Access.Logging.LogChecks 设置为 true 以记录权限检查(在调整 LuckPerms 组时有用)。

性能说明: 权限检查会在内部缓存几秒钟,以减少冗余和负载。

▶️ 3) 请求公告板访问规则(配置 vs LuckPerms)

请求公告板 是玩家拥有的。模组根据模式不同而评估权限:

  • 打开/使用请求公告板 UI 配置键: Access.RequestBoard.Use.RequirePermissionToUseRequestBoard 权限节点: questrequestboards.requestboard.use

    • 如果 RequirePermissionToUseRequestBoard = false → 任何人都可以打开。
    • 如果为 true → 仅在严格/LuckPerms 模式下强制执行(否则行为宽松,除非启用了失败关闭)。
  • 在请求公告板上创建请求 配置键: Access.RequestBoard.Create.OnlyOwnerCanCreateRequests 权限节点: questrequestboards.request.create

    • 配置回退模式:
      • 如果 OnlyOwnerCanCreateRequests = true → 只有公告板所有者才能创建请求。
      • 如果 false → 任何人都可以在任何公告板上创建请求。
      • 拥有 questrequestboards.request.create 权限可以作为绕过后台,允许即使在启用仅所有者模式时也能创建。
      • 在回退模式下,OP 可以绕过。
    • LuckPerms 模式:
      • 需要 questrequestboards.request.create 权限。
      • 仅凭所有权不能授予创建权限。
  • 完成/交付请求 权限节点: questrequestboards.request.fulfill

    • 配置回退模式: 允许所有人。
    • LuckPerms 模式: 需要 questrequestboards.request.fulfill 权限。
  • 取消请求 配置键: Access.RequestBoard.Manage.OtherPlayersCanCancelRequests 权限节点: questrequestboards.request.cancel.own, questrequestboards.request.cancel.any

    • 配置回退模式:
      • 所有者始终可以取消自己的请求。
      • 如果 OtherPlayersCanCancelRequests = true,其他玩家可以取消。
      • ...cancel.any 可以作为工作人员的绕过(即使配置不允许)。
    • LuckPerms 模式:
      • ...cancel.any 允许你取消任何请求。
      • 需要 ...cancel.own 才能取消自己的请求(仅凭所有权是不够的)。
  • 打开收件箱(已交付物品存储) 配置键: Access.RequestBoard.Manage.OtherPlayersCanOpenInbox 权限节点: questrequestboards.inbox.open.own, questrequestboards.inbox.open.any

    • 配置回退模式:
      • 所有者始终可以打开自己的收件箱。
      • 如果 OtherPlayersCanOpenInbox = true,其他玩家可以打开。
      • ...open.any 可用作工作人员的绕过。
    • LuckPerms 模式:
      • ...open.any 允许你打开任何人的收件箱。
      • 需要 ...open.own 才能打开自己的收件箱(仅凭所有权是不够的)。
  • 破坏/移除请求公告板方块 配置键: Access.RequestBoard.Break.AllowCreativeBreakAny, Access.RequestBoard.Break.AllowOpBreakAny, Access.RequestBoard.Manage.OtherPlayersCanBreakBoard 权限节点: questrequestboards.requestboard.break.any

    • 所有者始终可以破坏自己的公告板。
    • 非所有者:
      • 在严格/LuckPerms 模式下 → 需要 questrequestboards.requestboard.break.any 权限。
      • 在回退模式下 → 可以通过配置 (OtherPlayersCanBreakBoard) 允许,并且 OP 绕过同样适用。

▶️ 4) 任务公告板访问规则(配置 vs LuckPerms)

任务公告板 通常由管理员/工作人员控制。主要控件:

  • 打开/使用任务公告板 UI 配置键: Access.QuestBoard.Use.RequirePermissionToUseQuestBoard 权限节点: questrequestboards.questboard.use

  • 放置任务公告板 权限节点: questrequestboards.questboard.place

    • 配置回退模式: 允许。
    • LuckPerms 模式: 需要 questrequestboards.questboard.place 权限。
  • 编辑任务公告板 配置键: Access.QuestBoard.Edit.RequirePermissionToEditQuestBoard 权限节点: questrequestboards.questboard.edit

    • 如果配置标志为 false → 允许编辑。
    • 如果为 true
      • 回退模式: 权限 ...questboard.edit 可以作为绕过,否则允许所有者。
      • LuckPerms 模式: 需要 ...questboard.edit 权限(仅凭所有者是不够的)。
  • 管理任务金库 配置键: Access.QuestBoard.Treasury.RequirePermissionToManageTreasury 权限节点: questrequestboards.questboard.treasury

    • 如果配置标志为 false → 允许管理金库。
    • 如果为 true
      • 回退模式: 权限可以绕过;否则允许所有者。
      • LuckPerms 模式: 需要 ...questboard.treasury 权限。
  • 编辑任务完成指令 权限节点: questrequestboards.questboard.commands 配置键: Access.QuestBoard.Commands.*

    • Enabled:完成指令编辑的主开关。
    • OpOnly:如果为 true,则始终允许 OP。
    • OpOnlyOverridesPermissions:如果为 true 且 OpOnly 也为 true,则即使非 OP 玩家拥有权限也会被阻止。
    • AllowCreative:允许处于创造模式的玩家。
    • AllowPermission:允许通过 questrequestboards.questboard.commands 权限进行访问(仅在 LuckPerms 可用时有效)。
  • 完成任务 权限节点: questrequestboards.quest.complete

    • 回退模式: 允许。
    • LuckPerms 模式: 需要 questrequestboards.quest.complete 权限。
  • 破坏任务公告板 权限节点: questrequestboards.questboard.break.any 配置键: Access.QuestBoard.Break.AllowOpBreakAny

    • 所有者始终可以破坏自己的公告板。
    • 非所有者:
      • 在 LuckPerms/严格模式下 → 需要 questrequestboards.questboard.break.any 权限。
      • 可以根据 AllowOpBreakAny(和/或回退 OP 行为)允许 OP。

▶️ 5) 所有权限节点(LuckPerms / 原生权限)

根通配符(一切):

  • questrequestboards.* — 授予此模组中的所有内容。

请求公告板 / 请求:

  • questrequestboards.requestboard.use — 打开/使用请求公告板 UI(仅在严格/LuckPerms 模式下 RequirePermissionToUseRequestBoard 为 true 时强制执行)。
  • questrequestboards.request.create — 创建请求。
  • questrequestboards.request.fulfill — 完成/交付请求。
  • questrequestboards.request.cancel.own — 取消你自己的请求(在 LuckPerms 模式下必需)。
  • questrequestboards.request.cancel.any — 取消任何人的请求。
  • questrequestboards.inbox.open.own — 打开你自己的公告板收件箱(在 LuckPerms 模式下必需)。
  • questrequestboards.inbox.open.any — 打开任何人的公告板收件箱。
  • questrequestboards.requestboard.break.any — 破坏/移除任何请求公告板(非所有者)。

任务公告板 / 任务:

  • questrequestboards.questboard.use — 打开/使用任务公告板 UI(仅在严格/LuckPerms 模式下 RequirePermissionToUseQuestBoard 为 true 时强制执行)。
  • questrequestboards.questboard.place — 放置任务公告板(在 LuckPerms 模式下必需)。
  • questrequestboards.questboard.edit — 编辑任务公告板。
  • questrequestboards.questboard.treasury — 管理金库。
  • questrequestboards.questboard.commands — 编辑完成指令(仅在 AllowPermission 启用且 LuckPerms 可用时)。
  • questrequestboards.quest.complete — 完成任务(在 LuckPerms 模式下必需)。
  • questrequestboards.questboard.break.any — 破坏/移除任何任务公告板(非所有者)。

开发/调试指令:

  • questrequestboards.command.setboardowner — 使用 qrb_setboardowner 调试指令(仅当 Debug.DevCommandsEnabled 为 true 时注册)。

通配符支持(推荐): 模组通过向上扩展检查来支持 .* 通配符。你可以在 LuckPerms 中授予的示例:

  • questrequestboards.request.* — 所有与请求相关的权限(创建/完成/取消等)。
  • questrequestboards.inbox.* — 所有收件箱权限。
  • questrequestboards.questboard.* — 所有任务公告板管理权限。

注意: 通配符格式是 前缀.*(不仅仅是 前缀)。

▶️ 6) 建议的 LuckPerms 预设(作为“思维模板”复制)

普通玩家(请求公告板游戏流程) 授予这些,以便玩家在 LuckPerms 模式下实际可以使用自己的公告板:

  • questrequestboards.request.create
  • questrequestboards.request.fulfill
  • questrequestboards.request.cancel.own
  • questrequestboards.inbox.open.own

可选(仅当你将“RequirePermissionToUse…”标志设置为 true 时):

  • questrequestboards.requestboard.use

助手/版主(管理玩家公告板)

  • questrequestboards.request.cancel.any
  • questrequestboards.inbox.open.any
  • questrequestboards.requestboard.break.any

任务工作人员(管理任务公告板)

  • questrequestboards.questboard.place
  • questrequestboards.questboard.edit
  • questrequestboards.questboard.treasury
  • questrequestboards.questboard.commands(仅当 Commands.AllowPermission 启用时)
  • questrequestboards.questboard.break.any

管理员(一切)

  • questrequestboards.*

▶️ 7) 其他重要配置部分(限制 / 费用 / 请求 / 任务奖励 / 调试)

  • RequestBoard.Limits MaxBoardsPerPlayerAdventureEnabledMaxBoardsPerPlayerAdventure 限制玩家可以拥有的请求公告板数量,仅在冒险模式下生效。
  • 费用(在创建请求时收取)
    • Enabled:开启/关闭费用。
    • ModeFLAT(固定费用)或 PERCENT(百分比费用)。
    • FlatCopper:以铜币计的固定费用。
    • Percent:百分比费用 (0-100)。
    • DestinationBURN(移除金币)或 TREASURY(存储在模组金库文件中)。
  • 请求
    • DefaultDurationTicks:新请求的默认到期时间。
    • DefaultMinDeliveryQty:单次交付操作的最低交付数量。
    • MaxActivePerBoard:每个公告板允许的最大活跃请求数。
    • AllowLooseMatch:允许 LOOSE 匹配模式,即使一个物品 ID 带有命名空间而另一个没有,也能接受(例如 hytale:iron_ingot vs iron_ingot)。
  • QuestRewards
    • DefaultPaymentModeTREASURY(受存储资金限制)或 MINT(服务器铸造)。
    • DefaultRewardCopper:以铜币计的任务默认奖励价值。
  • 调试
    • Enabled:主调试开关。
    • DevCommandsEnabled:启用仅限开发的指令(如 qrb_setboardowner)。

▶️ 8) 默认配置文件(随模组提供)

{
  "schemaVersion": 1,
  "RequestBoard": {
    "Limits": {
      "MaxBoardsPerPlayerAdventureEnabled": false,
      "MaxBoardsPerPlayerAdventure": 1
    }
  },
  "Fees": {
    "Enabled": false,
    "Mode": "FLAT",
    "FlatCopper": 0,
    "Percent": 0.0,
    "Destination": "BURN"
  },
  "Requests": {
    "DefaultDurationTicks": 72000,
    "DefaultMinDeliveryQty": 1,
    "MaxActivePerBoard": 15,
    "AllowLooseMatch": false
  },
  "QuestRewards": {
    "DefaultPaymentMode": "TREASURY",
    "DefaultRewardCopper": 100
  },
  "Access": {
    "Provider": {
      "Enabled": true,
      "UseLuckPerms": false,
      "DefaultDenyWhenUnavailable": false
    },
    "Logging": {
      "LogChecks": false
    },
    "RequestBoard": {
      "Use": {
        "RequirePermissionToUseRequestBoard": false
      },
      "Create": {
        "OnlyOwnerCanCreateRequests": true
      },
      "Manage": {
        "OtherPlayersCanCancelRequests": false,
        "OtherPlayersCanOpenInbox": false,
        "OtherPlayersCanBreakBoard": false
      },
      "BreakConfig": {
        "AllowCreativeBreakAny": true,
        "AllowOpBreakAny": true
      }
    },
    "QuestBoard": {
      "Use": {
        "RequirePermissionToUseQuestBoard": false
      },
      "Edit": {
        "RequirePermissionToEditQuestBoard": true
      },
      "Commands": {
        "Enabled": true,
        "OpOnly": true,
        "OpOnlyOverridesPermissions": false,
        "AllowCreative": false,
        "AllowPermission": true
      },
      "Treasury": {
        "RequirePermissionToManageTreasury": true
      },
      "BreakConfig": {
        "AllowOpBreakAny": true
      }
    }
  },
  "Debug": {
    "Enabled": false,
    "DevCommandsEnabled": false
  }
}

📦 总结

任务与请求公告板 非常适合你需要以下功能的情况:

  • 一个由玩家驱动的委托系统
  • 结构化的服务器端任务
  • 通过配置实现完全控制
  • 在大型持久服务器上具有可靠的行为

📌 备注

  • 早期版本可能变化较快:请在评论区报告错误和反馈。
  • 此模组不添加默认任务/请求来获取金币,创建你世界中的经济体系取决于你。