Skip to content

上一页:物品类插件.md · 下一页:经济插件.md 相关:../02-服主指南/自定义方块.md · ../04-开发者/工具集.md · 概览.md

🧱 方块 / 模型 / 作物对接

除了「取物品」,QCL 还把三类世界交互能力接了进来:CraftEngine 的方块与家具、ModelEngine 的模型化实体、CustomCrops 的作物。它们一样遵循软依赖 + 反射桥:没装就静默不可用,绝不影响启动。

🧰 共同基座:本页所有桥的「多版本多签名兼容」都建立在 ReflectionBridge / ReflectionCache 之上 —— 同一个插件不同大版本的方法签名都能被自动找对。开发者细节见 👉 ../04-开发者/工具集.md


🛠️ 一、CraftEngine —— 物品 / 方块 / 家具

项目内容
桥类CraftEngineBridge / CraftEngineManager
涉及三类对象自定义物品、自定义方块、自定义家具

CraftEngine 的物品引用(ce-命名空间_id)见 物品类插件.md。本页关注它的方块家具能力。

🔧 CraftEngineManager 能力表

能力签名作用
构建物品buildItemStack(标识, 数量)取 CraftEngine 物品
放置方块placeBlock(位置, blockId, playSound)在指定位置放自定义方块,可选播放音效
移除方块removeBlock(方块)移除自定义方块
判断自定义方块isCustomBlock(方块)这个方块是不是 CraftEngine 自定义方块
读方块 idgetCustomBlockId(方块)取自定义方块的 id
放置家具placeFurniture(位置, 家具id) → 实体放家具,返回家具实体
移除家具removeFurniture(实体)移除家具
判断家具isFurniture(实体)这个实体是不是家具
读家具 idgetFurnitureId(实体)取家具 id

🪑 方块 vs 家具:CraftEngine 把「能踩在上面的方块」和「摆设实体(家具)」分成两套对象,所以放置/识别 API 也分两套 —— 方块用 *Block,家具用 *Furniture

🧩 CustomBlock 抽象层 —— 不绑死 CraftEngine

QCL 在 CraftEngine 之上又抽象了一层「自定义方块」,让上层逻辑不直接依赖某个具体插件:

组件角色
CustomBlockBridge聚合器:把所有「自定义方块提供者」汇总
CustomBlockProvider接口:id / isAvailable / isCustomBlock / getCustomBlockId / getCustomBlockAt
CraftEngineBlockProvider内置提供者,id = craftengine
CustomBlockConfig自定义方块的服主配置(见自定义方块页)

这意味着:以后再接别的方块插件,只要再实现一个 CustomBlockProvider 即可,上层无感。

服主侧如何配置自定义方块(掉落、行为等),见 👉 ../02-服主指南/自定义方块.md

🎯 典型用途

  • GUI / 脚本里程序化放置一个 CraftEngine 方块或家具。
  • 监听玩家破坏方块时,用 isCustomBlock + getCustomBlockId 判定「这是不是我配置的自定义方块」,从而决定掉落。

🤖 二、ModelEngine —— 模型化实体 / 动画 / 骨骼持物

项目内容
桥类ModelEngineBridge / Manager
检测类com.ticxo.modelengine.api.ModelEngineAPI

ModelEngine 让一个普通实体「穿上」一个 3D 模型,并播放动画。QCL 把这套能力包装成更顺手的 API。

🔧 桥能力表

能力作用
createModeledEntity(实体)把一个实体变成模型化实体
removeModeledEntity(...)取消模型化
getModeledEntity(...)取一个实体的模型化包装
createActiveModel(模型id)创建一个激活模型实例

📦 包装器 API

QCL 提供两个包装器,把反射调用收敛成清爽方法:

ModeledEntityWrapper(模型化实体包装)

方法作用
addModel(...)给实体加一个模型
removeModel(...)移除模型
setBaseEntityVisible(...)设置底层实体是否可见(常用来隐藏原版形体只显示模型)
destroy()销毁
getModels()取当前所有模型

ActiveModelWrapper(激活模型包装)

方法作用
playAnimation(名, 速度, force)播放指定动画
getBones()取骨骼列表
setHeldItem(骨骼, 物品)让某根骨骼「拿着」一个物品

⚡ Manager 快捷方法

方法作用
spawnModel(实体, 模型id, 隐藏底实体)一步:生成模型并可选隐藏底层实体
playAnimation(...)播放动画
setHeldItem(...)骨骼持物

🔄 桥对这些方法做了多签名兼容,应对 ModelEngine 不同版本的 API 差异。

🎯 典型用途

  • 生成一个带模型的 Boss / NPC,隐藏底层实体只显示模型。
  • 触发攻击/受击/死亡时 playAnimation 播放对应动画。
  • setHeldItem 让模型某根骨骼(手部)拿上武器物品。

🌾 三、CustomCrops —— 作物识别 / 收获 / 种植 / 生长 / 骨粉

项目内容
桥类CustomCropsBridge / Manager
检测类net.momirealms.customcrops.api.CustomCropsAPI

CustomCrops 提供一套自定义农作物系统,QCL 把它的核心动作都桥接了出来。

🔧 能力表

能力作用
isCrop(方块 / 位置)这个方块/位置是不是作物
getCropId(...)取作物 id
tryHarvest(方块, 玩家?)尝试收获(玩家参数可选)
tryPlant(位置, 玩家, 物品, cropId)尝试种植
tryGrow(位置, 骨粉?, 倍率?)尝试催生长(可带骨粉、生长倍率)
isBoneMeal(物品)这个物品是不是骨粉
getBoneMealItem()取骨粉物品

🌱 try* 系列方法返回的是「是否成功」语义,调用方可据此决定后续逻辑(如扣体力、给经验)。

🎯 典型用途

  • 自定义农场玩法:脚本里 tryPlant 帮玩家种地、tryHarvest 一键收割。
  • 道具效果:某个道具触发 tryGrow 给周围作物催熟。
  • 判定 isCrop / getCropId,让 GUI 或任务系统识别玩家面前的作物。

🧰 共同兼容基座:ReflectionBridge

再强调一次:上面所有桥的「多版本多签名兼容」都依赖底层的:

  • ReflectionBridge —— isClassAvailable(类名) 探测目标类是否存在。
  • ReflectionCache —— 缓存方法/字段查找(getMethod / findMethodByName / invoke / safeCall …)。

开发者若要在自己代码里复用这套反射工具,见 👉 ../04-开发者/工具集.md


📚 继续阅读