# SpigotMaster文档 ## `public class SpigotMaster extends JavaPlugin` SpigotMaster * **Package:** com.neteasemc.spigotmaster; * **Example:** ``` import com.neteasemc.spigotmaster.SpigotMaster; SpigotMaster spigotMaster = (SpigotMaster)Bukkit.getPluginManager().getPlugin("SpigotMaster"); ``` ## `public Material getCustomItemMaterial(String customItemIdentifier)` 该接口已废弃 * **Deprecated** ## `public String getCustomItemIdentifier(ItemStack spigotItemStack)` 获取自定义物品名的identifier * **Parameters:** `spigotItemStack` — itemStack * **Returns:** String 自定义物品identifier ## `public ItemStack setCustomItemIdentifier(ItemStack spigotItemStack, String customIdentifier)` 设置自定义物品的identifier * **Parameters:** * `spigotItemStack` — itemStack * `customIdentifier` — 自定义物品identifier * **Returns:** 设置后的itemStack ## `public ItemStack setItemLayer(ItemStack itemStack, int layer, String texture)` 设置物品的叠加贴图。与ModSDK的SetItemLayer用法一致 * **Parameters:** * `itemStack` — itemStack * `layer` — 贴图的层级。可以为-2,-1,1,2,3。负数层级显示在物品下方,正数的层级显示在物品上方。层级大的显示在层级小的上方。 * `texture` — 贴图的名字,对应资源包item_texture.json中的key。 * **Returns:** 设置后的itemStack(没设置成功会返回itemStack参数本身) ## `public String getItemLayer(ItemStack itemStack, int layer)` 获取物品的叠加贴图。与ModSDK的GetItemLayer用法一致 * **Parameters:** * `itemStack` — itemStack * `layer` — 贴图的层级。可以为-2,-1,1,2,3。 * **Returns:** 贴图的名字,不存在返回null ## `public ItemStack removeItemLayer(ItemStack itemStack, int layer)` 移除物品的叠加贴图。与ModSDK的RemoveItemLayer用法一致 * **Parameters:** * `itemStack` — itemStack * `layer` — 贴图的层级。可以为-2,-1,1,2,3。 * **Returns:** 移除后的itemStack(没移除会返回itemStack参数本身) ## `public void listenForSpigotMasterEvent(SpigotMasterEvent event, PyRpcHandler handler)` 监听spigot master的自定义事件 * **Parameters:** * `event` — SpigotMasterEvent的枚举值 * `handler` — 回调函数 ## `public void listenForEvent(String namespace, String system, String event, PyRpcHandler handler)` 注册客户端事件 * **Parameters:** * `namespace` — 来源客户端系统的namespace * `system` — 来源客户端系统的systemName * `event` — 事件名 * `handler` — 回调函数 ## `public void notifyToClient(Player player, String namespace, String system, String event, Map data)` 给指定玩家发送服务端事件 * **Parameters:** * `player` — 接收事件的玩家 * `namespace` — 在客户端系统使用ListenForEvent监听的namespace * `system` — 在客户端系统使用ListenForEvent监听的systemName * `event` — 事件名 * `data` — 事件参数。注意,要使用-2指代本地玩家的entityId。 ## `public void notifyToMultiClients(List players, String namespace, String system, String event, Map data)` 给多个玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家,而非某个固定的实体,所以不要在多播中发送这种信息。 * **Parameters:** * `players` — 接收事件的玩家列表 * `namespace` — 在客户端系统使用ListenForEvent监听的namespace * `system` — 在客户端系统使用ListenForEvent监听的systemName * `event` — 事件名 * `data` — 事件参数 ## `public void notifyToClientsNearby(@Nullable Player except, Location loc, double dist, String namespace, String system, String event, Map data)` 给某个位置附近一定半径内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家,而非某个固定的实体,所以不要在多播中发送这种信息。 * **Parameters:** * `except` — 发送事件时排除掉这个玩家,可以为null表示不排除 * `loc` — 圆心位置 * `dist` — 半径 * `namespace` — 在客户端系统使用ListenForEvent监听的namespace * `system` — 在客户端系统使用ListenForEvent监听的systemName * `event` — 事件名 * `data` — 事件参数 ## `public void broadcastToAllClient(@Nullable Player except, World world, String namespace, String system, String event, Map data)` 给某个world内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家,而非某个固定的实体,所以不要在多播中发送这种信息。 * **Parameters:** * `except` — 发送事件时排除掉这个玩家,可以为null表示不排除 * `world` — 所在world * `namespace` — 在客户端系统使用ListenForEvent监听的namespace * `system` — 在客户端系统使用ListenForEvent监听的systemName * `event` — 事件名 * `data` — 事件参数 ## `public void broadcastToAllClient(@Nullable Player except, String namespace, String system, String event, Map data)` 给服务器内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家,而非某个固定的实体,所以不要在多播中发送这种信息。 * **Parameters:** * `except` — 发送事件时排除掉这个玩家,可以为null表示不排除 * `namespace` — 在客户端系统使用ListenForEvent监听的namespace * `system` — 在客户端系统使用ListenForEvent监听的systemName * `event` — 事件名 * `data` — 事件参数 ## `public void enableCustomShopEntry(boolean useCustomShop)` 开启商城插件入口 * **Parameters:** `useCustomShop` — 是否使用自定义商城入口,为false时,则使用官方商城入口 * **Since:** 1.2.3 ## `public void openShop(Player player)` 打开指定玩家商城界面 注意:该接口需要使用商城插件,并调用接口开启商城插件 * **Parameters:** `player` — 玩家 * **Since:** 1.2.3 ## `public void closeShop(Player player)` 关闭指定玩家商城界面 注意:该接口需要使用商城插件,并调用接口开启商城插件 * **Parameters:** `player` — 玩家 * **Since:** 1.2.3 ## `public void showHintOne(Player player, @Nullable String text)` 推送冒泡提示给指定玩家 注意:该接口需要使用商城插件,并调用接口开启商城插件 * **Parameters:** * `player` — 指定玩家 * `text` — 提示字符串 * **Since:** 1.2.3 ## `public void showHintTwo(Player player, String head, @Nullable String tail)` 推送 拼接后的头尾两串冒泡提示 给指定玩家 注意:该接口需要使用商城插件,并调用接口开启商城插件 * **Parameters:** * `player` — 指定玩家 * `head` — 提示字符串首 * `tail` — 提示字符串尾 * **Since:** 1.2.3 ## `public void getPlayerOrderList(Player player, FutureCallback> callback)` 获取玩家未发货订单列表 * **Parameters:** * `player` — 指定玩家 * `callback` — FutureCallBack回调函数 * **Since:** 1.2.3 * **Example:** 回调参数为Map, 目前值为 | Key | Value | 解释 | | -----------------| ---------------| ---- | | player | Player | 玩家 | | json_result | 订单json数据 | 玩家 | ## `public void finPlayerOrder(Player player, List orderList, FutureCallback> callback)` 通知网易服务器完成指定玩家订单 * **Parameters:** * `player` — 指定玩家 * `orderList` — 订单id列表 * `callback` — FutureCallBack回调函数 * **Since:** 1.2.3 * **Example:** 回调参数为Map, 目前值为 | Key | Value | 解释 | | -----------------| ---------------| ---- | | player | Player | 玩家 | | json_result | 订单json数据 | 玩家 | ## `public void enableClientChatExtension(Player player)` 开启官方聊天扩展功能,需要在CLIENT_LOAD_ADDON_FINISH事件中调用 * **Parameters:** `player` — 指定玩家 * **Since:** 1.2.4 * **Example:** ``` SpigotMaster.listenForSpigotMasterEvent(CLIENT_LOAD_ADDON_FINISH, new PyRpcHandler() { @Override public void onEvent(Player player, Map data) { SpigotMaster.enableClientChatExtension(player); } }); ``` ## `public void disableClientChatExtension(Player player)` 关闭官方聊天扩展功能,需要在CLIENT_LOAD_ADDON_FINISH事件中调用 * **Parameters:** `player` — 指定玩家 * **Since:** 1.2.4 * **Example:** ``` SpigotMaster.listenForSpigotMasterEvent(CLIENT_LOAD_ADDON_FINISH, new PyRpcHandler() { @Override public void onEvent(Player player, Map data) { SpigotMaster.disableClientChatExtension(player); } }); ``` ## `public String getCustomEntityIdentifier(Entity entity)` 获取自定义实体的identifier * **Parameters:** `entity` — 需要设置的entity实例 * **Returns:** String 自定义物品identifier * **Since:** 1.3.1 ## `public Entity spawnEntity(Player player, Location loc, EntityType entityType, String neteaseClientIdentifier)` 生成自定义生物 * **Parameters:** * `player` — 玩家 * `loc` — 生成位置 * `entityType` — 原版生物类型 * `neteaseClientIdentifier` — 自定义生物identifier * **Returns:** Entity 自定义生物实例 * **Since:** 1.3.1 ## `public void spawnEntity(Player player, Entity entity, String neteaseClientIdentifier)` 转换成自定义生物 * **Parameters:** * `player` — 玩家 * `entity` — 生物实例 * `neteaseClientIdentifier` — 自定义生物identifier * **Returns:** Entity 自定义生物实例 * **Since:** 1.3.1 ## `public Entity spawnEntity(World world, Location loc, EntityType entityType, String neteaseClientIdentifier)` 生成自定义生物 * **Parameters:** * `world` — world实例 * `loc` — 生成位置 * `entityType` — 原版生物类型 * `neteaseClientIdentifier` — 自定义生物identifier * **Returns:** Entity 自定义生物实例 * **Since:** 1.3.8 ## `public void spawnEntity(World player, Entity entity, String neteaseClientIdentifier)` 转换成自定义生物 * **Parameters:** * `world` — 玩家 * `entity` — 生物实例 * `neteaseClientIdentifier` — 自定义生物identifier * **Returns:** Entity 自定义生物实例 * **Since:** 1.3.8 ## `public Entity setCustomEntityIdentifier(Entity entity, String customIdentifier)` 设置自定义实体的identifier * **Parameters:** * `entity` — 需要设置的entity实例 * `customIdentifier` — 自定义实体identifier * **Returns:** 设置后的entity * **Since:** 1.3.1 ## `public boolean sendForm(Player player, Form form)` 发送formui给指定玩家 * **Parameters:** * `player` — 指定玩家 * `form` — 表单类实例 * **Since:** 1.3.2 ## `public boolean sendForm(Player player, FormBuilder formBuilder)` 发送formui给指定玩家 * **Parameters:** * `player` — 指定玩家 * `formBuilder` — 表单builder类实例 * **Since:** 1.3.2 ## `public void setEntitySize(Entity entity, float height, float width)` 设置自定义实体的碰撞盒大小 * **Parameters:** * `entity` — 需要设置的entity实例 * `height` — 实体高度 * `width` — 实体宽度 * **Since:** 1.3.3 ## `public void setMythicMobIdentifier(Entity entity, String mobType)` 设置mythicmob的identifier 如: SkeletonKing 会自动转为客户端的 mythicmob:skeletonKing SkeletalMinion 会自动转为客户端的 mythicmob:skeletalMinion 即为:mythicmob:xxx xxx为首字母小写的mythicmob的identifier * **Parameters:** * `entity` — 需要设置的entity实例 * `mobType` — mythicmob的identifier * **Since:** 1.3.3 ## `public void setEntityScale(Entity entity, float scale)` 设置自定义实体的scale 注意,由于Java并不提供修改Scale接口,因此该接口仅为客户端暂时生效接口 玩家重登;掉线重连;后续进入的玩家都只能看到默认的scale,不能看到通过接口修改后的scale! 请留意该接口的使用时机! * **Parameters:** * `entity` — 需要设置的entity实例 * `scale` — scale * **Since:** 1.3.5 ## `public void sendBedrockPacket(int packetId, byte[] packetData)` 给所有玩家广播基岩版原生数据包, 注:网易基岩版客户端数据包协议库基于国际版MC进行修改,不符合当前BE客户端的协议版本(v503 MCBE版本1.18.30)的包体数据会导致客户端异常,包括但不限于断开连接,闪退以及游戏无响应 目前建议版本为v503 * **Parameters:** * `packetId` — 数据包id * `packetData` — 数据包数据 * **Since:** 1.3.7 * **Example:** ``` //修改客户端时间 org.cloudburstmc.protocol.bedrock.packet.TimePacket timePacket = new TimePacket(); ByteBuf setTimeByteBuf = ByteBufAllocator.DEFAULT.heapBuffer(128); timePacket.setTime(20000); setTimeByteBuf = ByteBufAllocator.DEFAULT.heapBuffer(128); org.cloudburstmc.protocol.bedrock.codec.v503.Bedrock_v503.CODEC.tryEncode(Bedrock_v503.CODEC.createHelper(), setTimeByteBuf, timePacket); int setTimeDataLen = setTimeByteBuf.readableBytes(); byte[] setTimeData = new byte[setTimeDataLen]; setTimeByteBuf.readBytes(setTimeData, 0, setTimeDataLen); setTimeByteBuf.release(); spigotMaster.sendBedrockPacket(setTimePacketId, setTimeData); ``` ## `public void sendBedrockPacketToPlayer(int packetId, byte[] packetData, Player player)` 给指定玩家广播基岩版原生数据包 注:网易基岩版客户端数据包协议库基于国际版MC进行修改,不符合当前BE客户端的协议版本(v503 MCBE版本1.18.30)的包体数据会导致客户端异常,包括但不限于断开连接,闪退以及游戏无响应 目前建议版本为v503 * **Parameters:** * `packetId` — 数据包id * `packetData` — 数据包数据数组 * `player` — 发送的玩家 * **Since:** 1.3.7 ## `public void setEntityGravity(int entityId, float gravity)` 设置实体重力系数 注:需要注意设置实体的时机,如果通过监听entityspawnevent修改则无法生效,因为此时客户端还未同步到相关实体! * **Parameters:** * `entityId` — 需要设置的entityId * `gravity` — 重力系数,如果为0则应用世界重力 * **Since:** 1.3.9 ## `public String getItemIconPath(ItemStack item)` 获取物品贴图路径(只能获取到原生物品的贴图) 注: 由于大部分方块由四方向(side/front/back/top)共四张贴图组成,因此,该接口只会默认返回side方向贴图,而formui只能支持单独一张贴图,因此对于方块而言,单纯使用该接口获取贴图后显示,效果并不佳,建议自行绘制贴图 * **Parameters:** `item` — 需要获取的ItemStack * **Since:** 1.3.10