> For the complete documentation index, see [llms.txt](https://hamsterbaron.gitbook.io/hamsterbaron/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hamsterbaron.gitbook.io/hamsterbaron/mechanic-guides/action.md).

# 动作块 / Action

## 了解动作块部分

动作块部分是整个机制开发的核心，此处将决定一个机制在被成功触发后具体拥有什么效果。从执行指令到修改特定属性数据，再到特殊的渲染效果与粒子特效，额外的动画控制与精细的模型调整等等，此处是您定义枪械特殊能力，发挥创意的主要板块。

***

## 如何使用动作块

您应在制作之前大致规划好想让枪械实现的效果，并设计好动作块与条件块，触发器的联动。一般情况下在触发器监听到触发事件后，才进行条件判断；在全部条件判断满足属性组设定的要求后，动作块就会开始按照属性组设定的参数运行。

通常，最为常用，拓展性也最强的逻辑块有两个：**指令执行块**与**属性编辑块**。

> * **指令执行块（Runcommand）**&#x53EF;以作为特定实体以特定形式执行各类指令。基于字符串拼接，依赖占位符可以实现指令内容的自动替换，因此开发者可灵活的将各类信息作为指令参数来唤起一个指令。此外，指令的执行成功与否更可以作为额外的逻辑节点使用。.
> * **属性编辑块（Modify）**&#x63D0;供了全面的对于 TacZ 相关数据与部分常见玩家数据的实时编辑能力；结合触发器，条件，目标选择器与延迟能够实现各类属性的精细控制。此外，它还被用于交互 Arcana 提供的变量系统，负责创建新的临时变量，起到信息传递的作用。

此外，Arcana 还提供了许多其他实用的动作块；对于混合端服务器开发者，推荐结合 Mythicmobs 插件中提供的 MetaSkill 功能实现最为丰富的事件内容。有关其他可用动作，请参考[可用动作块概览](/hamsterbaron/mechanic-guides/action/allactionlist.md)。

***

## 程序的运行顺序

动作块通常为**逐条执行**（因此，动作块在 YAML 配置文件中的先后顺序一般意味着执行顺序，除非设置了额外的执行延迟）全部的动作块正常压力情况下应在1-2tick内完全运行。

每一条动作可以单独设置执行延迟（Delay），此参数的原理是在该条动作（Action）开始执行时，将其加入一个延迟等待队列，经过指定 Tick 后则启动运行。因此，一旦动作开始执行，就必定会执行成功；所需的即时参数将在<mark style="color:$warning;">该动作被唤起时</mark>就读取而非延迟过后才读取。

依照单个机制文件的**文件名**（而非基础参数中所设置的技能名）程序将逐条判定枪械是否可以使用此机制并按**文件名排列顺序**启动机制的运行。因此，通常情况下，在 TPS 与 MSPT 处于正常水平时，一旦触发器被激活，对所有的可用机制，在上一个机制全部运行完毕后才会进入下一个机制的条件判定部分。

***

## 动作的作用对象

实际使用中常常会遇到一类问题：要对哪一实体进行操作？比如，使用指令时不同的身份有不一样的权限，作为不同实体执行时所需用的原版选择器也不一样。Arcana 将这个问题抛给机制中的每个动作自由决定。通过[目标选择器](/hamsterbaron/mechanic-guides/action/selector.md)，您可以灵活的指定每个动作的作用对象。下一章节将详细介绍这一功能。

大部分需要执行对象的动作都可以使用目标选择器。同样，目标选择器的信息获取与判定时间也与动作被激活的时间一致。有关动作中目标选择器如何生效，请参阅[可用动作块概览](/hamsterbaron/mechanic-guides/action/allactionlist.md)中每动作的详细界面。

***

## 灵活运用占位符

多数技能的关键参数允许使用**占位符**（Argument）以进行数据交互。该功能的运用是 Arcana 机制开发中的重要知识。占位符负责设置特定参数为某一变量，以及将变量拼接进参数字段中。通常情况下，动作块的所需参数中支持使用`args`键值对则意味着可在其他键值对中应用占位符。

每个占位符均被视为一个完整的表达式，在运算后将得到的结果传入并替换掉其他键值对中使用占位符的字段。占位符按顺序读取。变量读取<mark style="color:$warning;">将在占位符被访问时</mark>进行。以下是一个简单的示例：

```yaml
- !<SomeAction>
  ExamParam: "Hello $1,Result is $1,Current Timestamp:$2" #在参数中插入占位符
  # Other Parameter
  args:
  - "SelfName" #对应$1处的返回值,返回玩家名字
  - "SQRT(Var_result + 2)" #对应$2处的返回值，返回计分项tacz_result加2后求平方根的值
  - "DT_DATE_TO_EPOCH(DT_NOW())" #对应$3处的返回值，返回当前UNIX时间戳
```

假设玩家名字是`Dev`，该玩家在计分项`tacz_result`（该计分项同时会被视为 Arcana 创建的自定义变量）上的分数是7，当前时间是2022年3月19号上午10点15分，则示例字段在被调用时的值为：

```yaml
ExamParam: "Hello Dev,Result is 3,Current Timestamp:1647684900000"
```

{% hint style="info" %}
**开发提示**：有关于占位符可使用的全部变量与表达式内函数，请参照[变量与函数](/hamsterbaron/mechanic-guides/function.md)章节。
{% endhint %}

***

## 考虑合理的机制负载

为性能优化，Arcana 仅监听玩家当前武器拥有机制的触发信息，并将及时的作用到机制生效上。为了避免过于复杂的队列堵塞同一时间刻游戏的处理窗口，导致非预期的运作顺序问题，每一机制不应拥有过大的行动块部分，并应善于利用变量与信号两个系统传递信息至其他机制。

请注意，面对高频的持续性质触发器以及例如`ON_PLAYER_TICK` 等实时更新的触发器与属性配置时，更应加强单一技能对单一机制负载的轻量化问题，以避免同一时间刻堆积过多事件等待降临。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hamsterbaron.gitbook.io/hamsterbaron/mechanic-guides/action.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
