EliteScript
EliteScript 是 MagmaGuy 插件的综合脚本系统,提供高级自定义选项,用于为 Minecraft 中的 Boss 和其他实体创建动态行为。
EliteMobs 拥有两套脚本系统,而且两者都得到完整支持。EliteScript 并未被弃用。
- EliteScript(本页及其同级页面) —— 声明式 YAML。当你的能力就是"在发生某个事件时,对某些目标执行这些动作"时,它最合适。这里的内容没有任何一项被移除或取代。
- Lua 能力 —— 放在同一个
powers文件夹里的.lua文件。当你需要变量、循环、随机分支、每个 Boss 各自的状态,或者延时后续动作时,它最合适。EliteMobs 自带的能力现在都是用 Lua 编写的。
它们并不是竞争关系:Lua 的 context.script API 只是围绕 EliteScript 引擎的一层薄封装。当你在 Lua 中写 context.script:target({...}) 或 context.script:zone({...}) 时,你传入的表会被交给这些页面所记录的完全相同的目标/区域/相对向量/粒子代码,因此下文的每一个字段名都可以逐字照用。就算你之后转向 Lua,学习 EliteScript 也绝不会白费。
一个实际的推论:如果一个 .lua 能力和一个 .yml 能力共用同一个基础名称,那么 Boss 的 powers: 列表中指向该 .yml 的条目会被解析到 .lua 文件。自带能力正是靠这种方式完成迁移,而不会破坏已有的 Boss 配置。
概述
EliteScript 允许服务器管理员为自定义 Boss 和生物创建复杂的事件驱动行为。脚本系统建立在五个核心组件之上:
- Events:启动脚本执行的触发器(伤害、生成、死亡等)
- Conditions:执行动作必须满足的条件
- Actions:要执行的行为(伤害、传送、生成粒子等)
- Targets:动作影响的实体或位置
- Zones:世界中用于定位和检测的定义区域
- Cooldowns:防止脚本频繁触发的时间限制
Elite Scripts 可以作为独立的能力文件添加,也可以直接添加到自定义 Boss 配置文件中。
快速入门示例
以下是一个简单的 EliteScript,当 Boss 受到伤害时会对玩家施放闪电:
eliteScript:
LightningStrike:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: DIRECT_TARGET
repeatEvery: 20
times: 3
Cooldowns:
local: 60
global: 20
此脚本在玩家对 Boss 造成伤害时触发,然后对玩家施放 3 次闪电(每秒一次),冷却时间为 60 刻后才能再次触发。
脚本组件
EliteScript 通过其组件系统提供广泛的自定义功能。有关每个组件的详细信息,请参阅以下页面:
核心组件
- Events - 13 种事件类型,包括伤害、死亡、生成、战斗和基于区域的触发器
- Actions - 35 种动作类型,用于创建复杂行为
- Targets - 17 种目标类型,用于选择实体和位置
- Conditions - 具有多种检查类型的过滤和阻止条件
- Zones - 8 种区域形状(球体、圆柱体、长方体、射线、锥体等)
- Cooldowns - 局部和全局冷却系统
- 相对向量 - 高级定位和移动
常见用例
EliteScript 常用于:
- 阶段制 Boss 战:不同生命值百分比下的不同攻击模式
- 竞技场机制:特定区域中基于区域的伤害、增益或生成
- 自定义攻击:独特的粒子效果、投射物和范围攻击
- 环境危害:周期性闪电、坠落方块或火焰
- 互动机制:传送、生物生成和世界修改
- 玩家通信:消息、标题、动作栏和 Boss 栏
- 条件行为:基于玩家数量、位置或 Boss 状态的不同动作
实现
脚本可以通过两种方式实现:
- 能力文件:在
~/plugins/EliteMobs/powers/中创建独立的.yml文件 - 自定义 Boss 文件:直接在自定义 Boss 配置中添加
eliteScript:部分
有关创建能力和自定义 Boss 的详细说明,请参阅:
性能注意事项
创建脚本时,请牢记以下最佳实践:
- 使用冷却时间来防止快速触发脚本导致的性能问题
- 基于区域的事件(ZoneEnterEvent、ZoneLeaveEvent)计算成本较高——使用小区域和适当的冷却时间
- 使用过滤条件来减少不必要的检查
- 在部署到生产服务器之前彻底测试脚本
后续步骤
要开始创建您自己的 EliteScripts:
