Repository navigation
Releases: MINEZ/Denizen
Release list
v1.3.4-b7312.1
修复
- 随附的 DenizenCore 更新至上游最新代码,修复 JVM 启用紧凑对象头(
-XX:+UseCompactObjectHeaders)时反射授权出错的问题。DenizenCore 此前以写死的内存偏移改写AccessibleObject的访问标志,启用紧凑对象头后该偏移不再成立,改写会落在错误的位置,webget发送PATCH请求等依赖反射改写的功能因此失效。现改为在运行时探测实际偏移,探测不到时报错并放弃,不再盲目改写内存。
文档
- 修正两份 README 中的构建要求:26.x 模块所依赖的服务端 jar 以 Java 25 编译,因此需要 JDK 25 而非 JDK 17;1.21.11 及更早的版本需经 BuildTools 以
--remapped构建。示例版本号一并更新。 - README 顶部的 upstream 徽章改为在构建时按
pom.xml中的版本号自动生成,不再手动维护,并随之更新为 Denizen 1.3.4。 - README 中的示例构建号更新为当前所基于的上游构建 7312。
注意
- Denizen 本身的代码自 v1.3.4-b7311.1 以来没有变化,本版的修复来自重新构建时打包进来的 DenizenCore。未启用紧凑对象头的服务器不受上述问题影响,可以不必更新。
- 本 Fork 基于上游
dev的0ec1e501b,对应上游构建 #7312。 - 构建号格式为
<上游构建号>.<Fork 修订号>,所基于的上游构建由 #7311 变为 #7312,Fork 修订号随之从 1 重新计起,本版即7312.1。
v1.3.4-b7311.1
新增
- 支持 Paper 26.3。本版本同步了上游 Denizen 1.3.4 的全部更新,包括 26.3 模块及其适配修复。
改进
- 26.3 模块同步了本 Fork 此前在 26.2 模块中的全部改动:假实体在观看者重新加入或离开所在世界后的跟踪修复、伪装体在他人视角与真身重新加入后停在原地以及属性被真身覆盖的修复、
skin_layers兼容 mannequin、离线玩家物品栏一并读写盔甲与副手。
注意
- 上游更改了
teleport命令的行为:被传送的实体骑乘着载具时,载具会被一同传送到目的地,随后实体重新骑上。此前的脚本若依赖“传送时自动下马”,需要相应调整。 - 上游新增了
ItemTag.item_name属性,用于读写物品的默认名称(玩家无法修改的那一种)。物品的属性列表与序列化结果中会出现这一项。 - 上游移除了对 Apache 库的打包与重定位,本 Fork 的代码未使用该库,不受影响。
- 世界升级到 26.3 后无法降级回旧版本,升级前请先备份。
v1.3.3-b7303.8
修复
- 修复 26.2 上离线玩家的物品栏读写不到盔甲与副手的问题。自 1.21.5 起,玩家数据中的盔甲与副手不再存于
Inventory列表,而是单独存于equipment,此前离线物品栏只处理前者:经<PlayerTag.inventory>读取离线玩家的物品栏时,第 37 至 41 格始终为空;经contents等机制写入这些槽位时,改动也不会被保存。现在两者一并读取与保存。
注意
- 仅修复了 26.2 模块,其余版本的模块未作改动。
- 依赖“离线玩家的盔甲与副手读不到”这一旧行为的脚本需要相应调整:例如清空离线玩家物品栏的脚本,此前不会清掉盔甲与副手,现在会一并清掉。
v1.3.3-b7303.7
新增
- 新增
EntityTag.add_target_goal机制,经 Paper 的 Mob Goals API 为生物添加一个索敌目标,使其主动把符合实体匹配器的生物实体当作攻击目标,行为仿照原版“寻找玩家”的那一个:平均每半秒在范围内搜索一次,攻击其中最近的一个;目标死亡、离开范围、不再符合匹配器,或约 3 秒看不见后即告放弃。此前只能经attack从外部指定目标,原版 AI 一旦改换或遗忘目标,脚本就得重新指定。 - 输入为映射:
matcher必填,为实体匹配器,如mannequin或entity_flagged:my_flag;id默认default,同一生物上 ID 相同的目标会被替换;priority默认 3;range默认 16 格;must_see默认true,即必须看得见目标。 - 该目标与原版的索敌目标同处一个目标选择器,遵循同一套优先级,数值越小越优先:取默认的 3 时,僵尸仍优先攻击玩家(优先级 2),挨打后仍会转向攻击者(优先级 1);数值取得更小,则优先攻击符合匹配器的实体。
- 不会选中无敌的实体与创造、旁观模式的玩家,也不会抢走脚本或其他插件直接指定的目标。
- 新增
EntityTag.remove_target_goal机制,按 ID 移除经上述机制添加的索敌目标,不给出 ID 时移除全部;原版的目标不受影响。 - 新增
<EntityTag.target_goals>标签,返回经上述机制添加的索敌目标及其设置;目标正在生效时,另带当前追击的实体。
注意
- 索敌目标不随实体存盘,实体卸载后即告丢失,宜在
entity added to world事件中添加。 - 仅对经 AI 目标选择攻击对象的生物有效,如僵尸、骷髅、蜘蛛、苦力怕;猪灵、疣猪兽、监守者等由“大脑”驱动的生物不受影响。
- 带有索敌目标的生物在休眠期间仍会搜索,只是频率更低;为大量生物添加时,请留意其开销。
文档
- 在两份 README 中补充索敌目标的条目与说明。
- README 中的 upstream 徽章改用仓库内的 SVG 文件,不再因 GitHub 图片代理访问 shields.io 超时而无法加载。
v1.3.3-b7303.6
改进
areadisplay的网格间距改为随所在表面的面积放宽:面积每满 256 平方格,间距加宽一格,最宽 30 格。此前网格逐格一条,粒子数随面积成倍增长,稍大的区域便会超出单个显示 20 万个粒子的上限而无法创建。长方体的间距规则与 WorldEditSUI 相同,各对相对的面分别计算;多边形的侧面统一采用最宽那一面的间距,使横线绕一周首尾相接,顶面与底面则按多边形的实际面积计算;椭球体的纬线与经线按其外接长方体最大的一面计算,纬线改为自赤道起上下对称排布。- 网格线每格至多 2 个粒子,不再随
density一同加密,轮廓仍按density绘制。以density:3开启网格为例,50×20×50 的长方体由 53,544 个粒子降至 6,492 个,半径 30 的椭球体由 55,145 个降至 3,323 个;200×60×200 的长方体与半径 100 的椭球体此前超出上限,现分别只需 19,560 与 16,969 个。 areadisplay的挑点、排序与发包改在主线程以外进行,主线程每次重绘只记下观看者此刻的位置。此前发包全在主线程完成,大区域下每次重绘约占 8 ms。- 每次重绘不再在一刻内集中发出,而是分摊到整个间隔的各刻,至多 1 秒:默认 12 刻即分作 12 批,每批按序号交错取点,均匀覆盖整个显示。
- 上一轮尚未挑完点时跳过本轮,免得后台跟不上时任务越积越多;分摊期间下线或换了世界的观看者不再发送;后台出错时,每个显示只报告一次,不会逐刻刷屏。
- Denizen 停用时会清空所有区域显示并关闭后台线程,关服期间不再向正在断开的连接发包,热重载后也不会留下空转的线程。
- 新增
max_particles参数,限制每位观看者每次重绘至多收到的粒子数,默认 1000。范围内的点超过上限时,由近及远取舍,远处的点这一轮跳过。 areadisplay的默认粒子由end_rod改为flame。end_rod在客户端存活约 60 刻,远长于 12 刻的重绘间隔,同一处会叠着五六代粒子。这是一处行为变更——依赖旧默认值的脚本需显式写明particle:end_rod。
文档
- 补充说明网格间距的计算规则、网格线的粒子密度上限、
max_particles参数,以及分摊发送与异步发包的行为。
v1.3.3-b7303.5
新增
- 新增
areadisplay命令,以粒子持续描出长方体、多边形或椭球体区域的边框,直至到期或被移除,效果仿照 WorldEditSUI 的选区轮廓。长方体描出各成员盒的十二条棱,多边形描出上下两圈轮廓及各角的竖线,椭球体描出过其中心的三个椭圆,其余类型的区域描出其长方体边界。 - 用法与本 Fork 的
bossbar一致:以 ID 区分,提供auto、create、update、remove四种操作,remove可一次移除多个 ID。未给出players:时展示给全服玩家,其后加入服务器的玩家同样会看到;观看者按 UUID 记录,重新加入后照常可见。update时给出的players:会替换原有的观看者,带players:的remove则只移出这些玩家。 - 可通过
duration、particle、special_data、density、interval、range调整显示时长、粒子、附加数据、每格粒子数、重绘间隔与可见范围,update时只改动所给出的项。special_data的格式与playeffect相同。range超过 32 格时改为强制发送粒子,原版客户端不渲染 32 格以外的普通粒子。 grid:true会在区域表面每隔一格加画网格线,可随时经update开关。- 区域在传入时存为快照,之后改动记名区域不会影响正在显示的轮廓。区域显示仅存于内存,服务器重启后即告清空,重载脚本不受影响。
- 新增
<server.area_displays>、<server.area_display[<id>]>与<PlayerTag.area_display_ids>三个标签,分别返回当前所有区域显示的 ID、指定区域显示的详情,以及该玩家能看到的区域显示的 ID。 - 单个区域显示最多容纳 20 万个粒子点,超出时报错并跳过此次创建或更新;区域很大时,请降低
density或关闭网格。 - WorldEditSUI 以 GPL 授权,本实现系独立编写,未取用其任何代码。
v1.3.3-b7303.4
改动
bossbar在未给出players:时改为默认展示给全服玩家,并跟随人员变动:只要该 bossbar 尚在,其后加入服务器的玩家同样会看到。这是一处行为变更——此前未给出players:时只展示给关联玩家,依赖旧行为的脚本需显式写明players:<player>。bossbar create不再要求脚本具有关联玩家,此前没有关联玩家时会以Missing player input!报错中止。- 对全服可见的 bossbar 使用带
players:的remove会将其收窄至当下能看到它的那批玩家,其后加入的玩家不再跟随。
修复
- 修复观看者重新加入服务器后看不到 bossbar 的问题。Bukkit 按玩家实例记录 bossbar 的观看者,而玩家所对应的实例并不能挺过一次断线,重新加入时换成另一个实例,原实例却仍留在观看者集合中。现改为另按 UUID 记录观看者,玩家重新加入时据此补发。显式指定过
players:的 bossbar 同样适用。 - 修复作废的玩家实例被持有至 bossbar 消失的问题。该实例既无从回收,又会继续出现在
<server.bossbar_viewers[<bossbar_id>]>之中。现改为在玩家退出时将其从 Bukkit 侧撤下,观看者名册不受影响。 - 修复
bossbar update与bossbar remove在players:指名的玩家离线时抛出IllegalArgumentException的问题,现改为与create一致,给出可读的报错并跳过该玩家。
v1.3.3-b7303.3
修复
- 修复
dialog脚本容器的exit button无法绑定script段的问题。按钮 ID 会被拼进命名空间形式的点击回传 key,而exit button中的空格不被命名空间 key 接受,此前会报出its ID cannot be used in a namespaced key并静默丢弃该按钮的动作,script段永不执行。现在 ID 中的空格会折成下划线,buttons下键名带空格的按钮同样受益。 - 修复写在
base.exit button下的退出按钮在点击时无法反查到自身脚本段的问题。此前回传路径写死为容器根部的exit button,与文档所述的base段位置不符。 <context.button_id>对退出按钮返回exit_button。
文档
- 补充说明
base.after action取none时会一并作用于退出按钮与 Esc 键,因此list与multi对话框使用none时,必须给exit button写一段关闭对话框的脚本,否则玩家无法离开该对话框。 - 补充说明
exit button可以带自己的script段,以及按钮 ID 折叠为点击 key 的规则。
v1.3.3-b7303.2
文档
- 补上
dialog脚本容器base.after action的说明。该键一直可用,取值为close(缺省)、none或wait_for_response,决定按钮被点击后客户端如何处置对话框界面。按钮要打开下一个对话框时请填none,否则客户端会先退回游戏界面,导致鼠标光标被重置到屏幕正中。
改进
base.after action填入非法取值时,报错信息会一并列出合法取值;该键留空不再有抛出异常的可能。
v1.3.3-b7303.1
基于上游构建 7303(d86db00)。上一个发布版本为 1.3.3-b7302.6,其间的 7302.7 与 7302.8 未单独发布,内容已并入本版。
新增
读取 CraftEngine 容器数据的 11 个标签。 CraftEngine 自带 Denizen 集成,但未提供读取容器内容的途径,相关请求已被上游拒绝(craft-engine#810,closed as not planned),理由是这些容器属于注册的自定义行为而非通用功能。现覆盖可定义容器的三种行为:drawer_block、simple_storage_block 与 simple_storage_furniture。
抽屉方块:
<LocationTag.has_ce_drawer[(<data_key>)]><LocationTag.ce_drawer_item[(<data_key>)]><LocationTag.ce_drawer_item_quantity[(<data_key>)]><LocationTag.ce_drawer_max_quantity[(<data_key>)]><LocationTag.ce_drawer_data_keys>
简单存储方块:
<LocationTag.has_ce_storage_inventory[(<data_key>)]><LocationTag.ce_storage_inventory[(<data_key>)]><LocationTag.ce_storage_inventory_data_keys>
简单存储家具:
<EntityTag.has_ce_storage_inventory[(<data_key>)]><EntityTag.ce_storage_inventory[(<data_key>)]><EntityTag.ce_storage_inventory_data_keys>
存储类标签返回的是实时容器,写入即时生效。各标签均可选填 data key,与行为的 data_key 配置项按原样精确匹配,不做命名空间补全;不填时取方块或家具上声明的第一个容器,..._data_keys 一系则按同一顺序列出全部。家具未配置 data_key 时,标签返回其内容实际所在的键 craftengine:simple_storage_contents,而非空值——CraftEngine 仅在读写存档时才回落到这个默认值。家具侧的实体解析与 CraftEngine 自身一致,底座实体、座位、碰撞体三者皆可。
需要留意 ce_drawer_max_quantity 随所存物品变化:配置为 32 组的抽屉在空置时返回 32,放入物品后返回 32 乘以该物品的最大堆叠数;兼容模式(compatible_mode: true)例外,恒返回所配置的组数。
CraftEngine 全程经反射访问,不产生任何编译期依赖,因此无须为其准备 jar。成员先按名、再按类型查找,CraftEngine 改名不至于让标签失效;结构确实变动或 CraftEngine 未安装时,相应的一组标签不注册并在控制台留下提示,不影响 Denizen 的其余部分。已在 CraftEngine 26.8.2 上核对。
修复
伪装体的属性被真身覆盖。 伪装体与观看者建立配对时会发出自己那套属性,紧接着真身的属性包以相同的实体编号送达,将其覆盖,于是 as:<类型>[attribute_base_values=[scale=0.1]] 之类一概不起作用。现改为对被伪装者以外的观看者丢弃真身的属性包。被伪装者本人的仍原样放行——其客户端的移动预测系于此,换成伪装体的会招致手感异常乃至位置回弹——因此自视伪装(self)看到的仍是原大小。
已知限制
伪装体的属性只在与观看者配对时同步一次,挂上之后再 adjust 伪装体的属性不会推送给已在观看的人,需其走出视野再回来。