Skip to content

自定义红石方块 ​

自定义红石方块让你的方块能够参与红石电路,作为信号源输出红石信号,或作为机械元件接收红石信号并触发脚本逻辑。通过 netease:redstone 组件即可完成配置,不需要设置 base_block。

前置条件

本功能不需要开启实验性玩法。请先阅读 自定义基础方块 了解方块注册流程和 JSON 组件基础。如果你需要在信号变化时执行逻辑,还需了解 Python 脚本开发。

概述 ​

自定义红石方块分为两种类型:

  • 信号源(producer) — 放置后主动发出红石信号,类似原版红石块、拉杆。信号强度通过 strength 字段设置(1~15)
  • 机械元件(consumer) — 放置后被动接收红石信号,类似原版活塞、红石灯。当接收到的信号强度变化时,引擎会触发 BlockStrengthChangedServerEvent 事件

两种类型不需要设置 base_block,只需在 components 中添加 netease:redstone 组件。

netease:redstone 组件 ​

键类型默认值说明
typestring—必填,"producer"(信号源)或 "consumer"(机械元件)
strengthint—可选,仅 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 方块接收到的红石信号强度发生变化时,引擎会触发此事件。

事件参数:

参数类型说明
blockNamestring方块标识符
posXint方块 X 坐标
posYint方块 Y 坐标
posZint方块 Z 坐标
dimensionIdint维度 ID
oldStrengthint变化前的信号强度
newStrengthint变化后的信号强度

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 方块放置后周围红石粉不亮 ​

排查步骤:

  1. 确认 netease:redstone 的 type 为 "producer"
  2. 确认 strength 值在 1~15 范围内
  3. 确认红石粉与方块相邻放置
  4. 确认没有其他方块阻隔信号传播

consumer 方块的 BlockStrengthChangedServerEvent 没有触发 ​

排查步骤:

  1. 确认 netease:redstone 的 type 为 "consumer"
  2. 确认 Python 脚本正确监听了 BlockStrengthChangedServerEvent
  3. 确认有红石信号源(红石粉、中继器等)连接到该方块
  4. 事件仅在信号强度发生变化时触发,如果强度没有变化则不会触发

信号源强度能否动态修改 ​

目前 strength 是在 JSON 中静态配置的,方块放置后信号强度固定。如果需要动态改变信号强度,可以通过脚本替换方块为不同 strength 值的方块来实现。

提示

自定义红石方块遵循原版红石信号的传播规则。信号强度每经过一个红石粉方块衰减 1 点,最远传播 15 格。

下一步 ​