# Spigot自定义实体

# 简要原理

目前Spigot服自定义实体基于实体metadata实现,换皮/继承创建实体的同时写入自定义实体identifier

  • 客户端identifier和服务端identifier无须一一对应,只需要在创建生物时确定即可

# 简要开发流程

  • 开发流程如下:

    1. 编写客户端Mod,制作生物的模型、贴图、动画、客户端逻辑等
    2. 编写Spigot插件,制作生物运行逻辑、属性、生成规则等
  • 对于客户端Mod来说,请参照文档 自定义生物 制作生物的模型、贴图、动画等

    • 与纯基岩版的自定义生物区别在于,绝大部分Components、ComponentGroups、events均需要通过Java插件实现,无法通过Json配置生效
    • 客户端Mod的主要作用为告知客户端当生成对应Identifier生物时,渲染的模型、贴图、动画、碰撞体等
  • 对于Spigot插件来说,目前支持了三种自定义生物方式

    • 简单换皮指定生物,并通过Spigot接口,修改生物属性,如血量等
    • 兼容MythicMob插件,继承MythicMob生物类
      • (Demo展示了4.13.0版本MythicMob的兼容方式)
      • 其他版本的MythicMob请根据各个版本的接口进行兼容
    • 反射注册类生物,并创建新生物类实例,覆写继承类方法,如攻击等,最后加入到世界中
  • 详细步骤可参考Demo

# Demo详解

详见文档自定义实体Demo详解

# Q&A

  • 由于配置中的componentscomponent_groupsevents均为服务端逻辑,因此均需Spigot插件实现,直接在Json中配置无法生效或效果异常。目前已知可用的components如下:

    - 自定义生物components
    ```
    // 设置生物碰撞盒大小
    "minecraft:collision_box": {
        "width": 3,
        "height": 3
    }
    
    // 设置生物可骑乘、骑乘位置,偏移、蹲伏可交互等
    "minecraft:rideable": {
      "priority": 0,
      "seat_count": 2,
      "crouching_skip_interact": true,
      "family_types": [
          "player"
      ],
    
      "seats": [
        {
          "position": [ 0.0, 1, 0.0 ]
        },
        {
          "position": [ 0.0, 1, -1.0 ]
        }
      ]
    },
    
    // 设置骑乘生物是否可以蓄力跳跃,有则可跳跃,没有则不可跳跃
    "minecraft:can_power_jump" : {}
    ```
    
  • 1.12版本的Spigot由于需要使用Viaversion,因此在通过反射注册新生物时,需要注意生物的type必须复用已有的生物,或者同时为Viaversion注册,不然会出现生物无法生成的问题。