自定义红石方块
自定义红石方块让你的方块能够参与红石电路,作为信号源输出红石信号,或作为机械元件接收红石信号并触发脚本逻辑。通过 netease:redstone 组件即可完成配置,不需要设置 base_block。
前置条件
本功能不需要开启实验性玩法。请先阅读 自定义基础方块 了解方块注册流程和 JSON 组件基础。如果你需要在信号变化时执行逻辑,还需了解 Python 脚本开发。
概述
自定义红石方块分为两种类型:
- 信号源(producer) — 放置后主动发出红石信号,类似原版红石块、拉杆。信号强度通过
strength字段设置(1~15) - 机械元件(consumer) — 放置后被动接收红石信号,类似原版活塞、红石灯。当接收到的信号强度变化时,引擎会触发
BlockStrengthChangedServerEvent事件
两种类型不需要设置 base_block,只需在 components 中添加 netease:redstone 组件。
netease:redstone 组件
| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
type | string | — | 必填,"producer"(信号源)或 "consumer"(机械元件) |
strength | int | — | 可选,仅 producer 类型有效,红石信号强度,取值 1~15 |
注意
consumer类型的初始信号强度为0(未激活),不能通过strength字段设置初始值strength仅对producer类型生效,对consumer设置无效
信号源方块(producer)
信号源方块放置在地图上后会持续发出红石信号。周围的红石元件(红石粉、中继器、比较器等)会接收到该信号。
完整 JSON 示例
文件路径:行为包/netease_blocks/redstone_source.json
json
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "mymod:redstone_source",
"register_to_create_menu": true,
"category": "Nature"
},
"components": {
"minecraft:destroy_time": { "value": 1.5 },
"minecraft:explosion_resistance": { "value": 6.0 },
"minecraft:map_color": "#FF0000",
"netease:redstone": {
"type": "producer",
"strength": 10
}
}
}
}放置后,该方块会持续输出强度为 10 的红石信号。
机械元件方块(consumer)
机械元件方块放置在地图上后会接收红石信号。当接收到的信号强度发生变化时,引擎触发 BlockStrengthChangedServerEvent 事件,你可以在 Python 脚本中监听该事件执行自定义逻辑。
完整 JSON 示例
文件路径:行为包/netease_blocks/redstone_consumer.json
json
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "mymod:redstone_consumer",
"register_to_create_menu": true,
"category": "Nature"
},
"components": {
"minecraft:destroy_time": { "value": 1.5 },
"minecraft:explosion_resistance": { "value": 6.0 },
"minecraft:map_color": "#00FF00",
"netease:redstone": {
"type": "consumer"
}
}
}
}BlockStrengthChangedServerEvent
当 consumer 方块接收到的红石信号强度发生变化时,引擎会触发此事件。
事件参数:
| 参数 | 类型 | 说明 |
|---|---|---|
blockName | string | 方块标识符 |
posX | int | 方块 X 坐标 |
posY | int | 方块 Y 坐标 |
posZ | int | 方块 Z 坐标 |
dimensionId | int | 维度 ID |
oldStrength | int | 变化前的信号强度 |
newStrength | int | 变化后的信号强度 |
Python 脚本示例
python
import server.extraServerApi as serverApi
ServerSystem = serverApi.GetServerSystemCls()
class RedstoneServer(ServerSystem):
def __init__(self, namespace, systemName):
super(RedstoneServer, self).__init__(namespace, systemName)
engineNs = serverApi.GetEngineNamespace()
engineSys = serverApi.GetEngineSystemName()
self.ListenForEvent(engineNs, engineSys,
'BlockStrengthChangedServerEvent', self, self.OnStrengthChanged)
def OnStrengthChanged(self, args):
blockName = args["blockName"]
pos = (args["posX"], args["posY"], args["posZ"])
dimensionId = args["dimensionId"]
oldStrength = args["oldStrength"]
newStrength = args["newStrength"]
if blockName != "mymod:redstone_consumer":
return
if newStrength > 0:
# 方块被激活 — 执行开启逻辑
self.ActivateBlock(pos, dimensionId, newStrength)
else:
# 方块失活 — 执行关闭逻辑
self.DeactivateBlock(pos, dimensionId)
def ActivateBlock(self, pos, dimensionId, strength):
"""方块被红石信号激活时的自定义逻辑"""
msgComp = serverApi.GetEngineCompFactory().CreateMsg(self.levelId)
# 示例:向所有玩家发送提示
msgComp.SendMsg("mymod:redstone_activated", {
"pos": pos,
"strength": strength
})
def DeactivateBlock(self, pos, dimensionId):
"""方块失去红石信号时的自定义逻辑"""
pass常见问题
producer 方块放置后周围红石粉不亮
排查步骤:
- 确认
netease:redstone的type为"producer" - 确认
strength值在 1~15 范围内 - 确认红石粉与方块相邻放置
- 确认没有其他方块阻隔信号传播
consumer 方块的 BlockStrengthChangedServerEvent 没有触发
排查步骤:
- 确认
netease:redstone的type为"consumer" - 确认 Python 脚本正确监听了
BlockStrengthChangedServerEvent - 确认有红石信号源(红石粉、中继器等)连接到该方块
- 事件仅在信号强度发生变化时触发,如果强度没有变化则不会触发
信号源强度能否动态修改
目前 strength 是在 JSON 中静态配置的,方块放置后信号强度固定。如果需要动态改变信号强度,可以通过脚本替换方块为不同 strength 值的方块来实现。
提示
自定义红石方块遵循原版红石信号的传播规则。信号强度每经过一个红石粉方块衰减 1 点,最远传播 15 格。
下一步
- 自定义基础方块 — 回顾方块注册流程和组件配置
- 方块组件速查 — 所有方块组件一览
- Python 脚本开发 — 学习如何编写服务端脚本
- 特殊方块类型 — 刷怪箱、传送门、流体等更多特殊方块
