Freeze_Dolphin
本帖最后由 Freeze_Dolphin 于 2020-7-12 13:48 编辑

此文章使用spigot-1.12.2为核心,远古工艺(翻译版的Slimefun)进行开发演示
如果你没有基础的话,建议先看我的前两篇教程:教程1 教程2

阅读本教程可以学会

正式开始

注册可充电物品
可充电物品对应的类是ChargableItem
该类继承了SlimefunItem,所以可以直接注册
这里以实现一个纳米剑为例子进行教学
先写一个物品堆常量:
  1. public static final ItemStack NANO_SWORD = new CustomItem(Material.DIAMOND_SWORD, "&8纳米剑", 0, new String[] {"", "&8⇨ &7每次攻击消耗 &e0.2 J", "", "&c&o&8⇨ &e⚡ &70 / 128 J"});
复制代码
注意:凡是可充电物品,其lore的最后一行必须是表示电量条的 "&c&o&8⇨ &e⚡ &70 / 128 J"
否则在之后获取电量的时候将返回 0
其中 "0" 表示初始电量, "128" 表示最大电量,只有这两个数据可以改动,其他的切勿改动(所以建议复制这条lore,然后参照格式自己进行改动)
(提醒:不要把表示颜色的&7和表示初始电量的0和在一起看成70了
然后注册物品:
  1. (new ChargableItem(Categories.WEAPONS, NANO_SWORD, "NANO_SWORD", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, SlimefunItems.CARBONADO, null, null, SlimefunItems.CARBONADO, null, SlimefunItems.HEATING_COIL, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.HEATING_COIL}, "Weapon")).register(false);
复制代码

这里使用的合成表是:

这里有一个非常滑稽的地方
就是实现ChargableItem的最后一个参数
根据该类的构建器中写的“chargeType”可以看出这应该是提供物品类型的
然而我用搜索工具找遍了Slimefun源码都没有找到利用了chargeType的地方
但即使这样,这个参数也不要乱填,因为可能其他的拓展会用到
(我猜测作者本来可能打算把它用于充电座)

控制物品电量
有了刚才编写可充电物品的经验
不难想到,控制物品电量就是修改lore
Slimefun中提供了修改可充电物品lore的api
这个工具类位于me/mrCookieSlime/Slimefun/api/energy/ItemEnergy
用这个类可以很方便的对可充电物品的电量进行修改与获取
这里以一个例子介绍其中几个重要的函数(方法)
刚才注册的纳米剑中有一行lore写道:
"&8⇨ &7每次攻击消耗 &e0.2 J"

这行lore是没有实际作用的,需要我们自己用代码去实现

先写一个监听器(这里为了方便展示我就只写一个方法了,监听器是很基础的,如果这都不会请先去看插件开发入门教程)
  1. @EventHandler
  2.                 public void onAttack(EntityDamageByEntityEvent e) {
  3.                         if (e.getDamager() instanceof LivingEntity) {
  4.                                 ItemStack hand = ((LivingEntity) e.getDamager()).getEquipment().getItemInMainHand();
  5.                                 if (SlimefunManager.isItemSimiliar(hand, NANO_SWORD, false)) {
  6.                                         if (ItemEnergy.getStoredEnergy(hand) >= 2F) {
  7.                                                 e.setDamage(e.getDamage() + 2D);
  8.                                                 ItemEnergy.chargeItem(hand, -2F);
  9.                                         } else {
  10.                                                 e.setCancelled(true);
  11.                                                 e.getDamager().sendMessage("电量不足");
  12.                                         }
  13.                                 }
  14.                         }
  15.                 }
复制代码

记得要注册监听器啊

这里解释其中几个方法:
这里判断攻击者是否是LivingEntity而不是判断是否是Player,是为了能够让插件对僵尸骷髅这类能持有物品的生物添加支持
这样僵尸骷髅也能使用纳米剑了

  1. SlimefunManager.isItemSimilar(ItemStack, ItemStack, boolean)
复制代码

这个方法是用于判断两个物品是否相同的(凡是判断Slimefun物品和普通物品是否相同都一定要用这个方法!
最后一个boolean参数表示“是否判断lore”
这里填false是因为可充电物品的lore会不断变动的(因为使用lore来表示电量)
如果填true就只有特定电量的纳米剑才能触发这个事件

  1. if (ItemEnergy.getStoredEnergy(hand) >= 0.2F) { ... }
复制代码
这是一个简单的判断句
简单翻译一下就是:物品hand中存有的电量是否大于等于0.2 J
如果真,就将攻击的伤害增加2(1心),并将物品hand的电量扣除0.2
如果假,就取消攻击的伤害,并对攻击者发射一条“电量不足”的信息

ItemEnergy类中还有几个有用的方法,大家可以自己翻翻源码去阅读,这里不再叙述



本教程所有源码在教程内,所以无附件





2021.12 数据,可能有更多内容此文章使用spigot-1.12.2为核心,远古工艺(翻译版的Slimefun)进行开发演示如果你没有基础的话,建议先看我的前两篇教程:教程1 教程2
阅读本教程可以学会
  • 注册可充电物品
  • 对可充电物品的电量进行控制

正式开始
注册可充电物品可充电物品对应的类是ChargableItem该类继承了SlimefunItem,所以可以直接注册这里以实现一个纳米剑为例子进行教学先写一个物品堆常量:

代码:

  1. public static final ItemStack NANO_SWORD = new CustomItem(Material.DIAMOND_SWORD, "&8纳米剑", 0, new String[] {"", "&8⇨ &7每次攻击消耗 &e0.2 J", "", "&c&o&8⇨ &e⚡ &70 / 128 J"});
注意:凡是可充电物品,其lore的最后一行必须是表示电量条的 "&c&o&8⇨ &e⚡ &70 / 128 J"否则在之后获取电量的时候将返回 0其中 "0" 表示初始电量, "128" 表示最大电量,只有这两个数据可以改动,其他的切勿改动(所以建议复制这条lore,然后参照格式自己进行改动)(提醒:不要把表示颜色的&7和表示初始电量的0和在一起看成70了)如果你的ide不支持在源码中加入unicode特殊字符,可以使用这个:"&c&o&8\u21E8 &e\u26A1 &70 / 128 J"
然后注册物品:

代码:

  1. (new ChargableItem(Categories.WEAPONS, NANO_SWORD, "NANO_SWORD", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, SlimefunItems.CARBONADO, null, null, SlimefunItems.CARBONADO, null, SlimefunItems.HEATING_COIL, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.HEATING_COIL}, "Weapon")).register(false);

这里使用的合成表是:
空 黑钻 空空 黑钻 空线圈 小电容 线圈
这里有一个非常滑稽的地方就是实现ChargableItem的最后一个参数根据该类的构建器中写的“chargeType”可以看出这应该是提供物品类型的然而我用搜索工具找遍了Slimefun源码都没有找到利用了chargeType的地方但即使这样,这个参数也不要乱填,因为可能其他的拓展会用到(我猜测作者本来可能打算把它用于充电座)
控制物品电量有了刚才编写可充电物品的经验不难想到,控制物品电量就是修改loreSlimefun中提供了修改可充电物品lore的api这个工具类位于me/mrCookieSlime/Slimefun/api/energy/ItemEnergy用这个类可以很方便的对可充电物品的电量进行修改与获取这里以一个例子介绍其中几个重要的函数(方法)刚才注册的纳米剑中有一行lore写道:
"&8⇨ &7每次攻击消耗 &e0.2 J"

这行lore是没有实际作用的,需要我们自己用代码去实现
先写一个监听器(这里为了方便展示我就只写一个方法了,监听器是很基础的,如果这都不会请先去看插件开发入门教程)

代码:

  1. @EventHandler
  2.     public void onAttack(EntityDamageByEntityEvent e) {
  3.    if (e.getDamager() instanceof LivingEntity) {
  4.   ItemStack hand = ((LivingEntity) e.getDamager()).getEquipment().getItemInMainHand();
  5.   if (SlimefunManager.isItemSimiliar(hand, NANO_SWORD, false)) {
  6.     if (ItemEnergy.getStoredEnergy(hand) >= 2F) {
  7.    e.setDamage(e.getDamage() + 2D);
  8.    ItemEnergy.chargeItem(hand, -2F);
  9.     } else {
  10.    e.setCancelled(true);
  11.    e.getDamager().sendMessage("电量不足");
  12.     }
  13.   }
  14.    }
  15.     }

记得要注册监听器啊
这里解释其中几个方法:这里判断攻击者是否是LivingEntity而不是判断是否是Player,是为了能够让插件对僵尸骷髅这类能持有物品的生物添加支持这样僵尸骷髅也能使用纳米剑了

代码:

  1. SlimefunManager.isItemSimilar(ItemStack, ItemStack, boolean)

这个方法是用于判断两个物品是否相同的(凡是判断Slimefun物品和普通物品是否相同都一定要用这个方法!)最后一个boolean参数表示“是否判断lore”这里填false是因为可充电物品的lore会不断变动的(因为使用lore来表示电量)如果填true就只有特定电量的纳米剑才能触发这个事件

代码:

  1. if (ItemEnergy.getStoredEnergy(hand) >= 0.2F) { ... }
这是一个简单的判断句简单翻译一下就是:物品hand中存有的电量是否大于等于0.2 J如果真,就将攻击的伤害增加2(1心),并将物品hand的电量扣除0.2如果假,就取消攻击的伤害,并对攻击者发射一条“电量不足”的信息
ItemEnergy类中还有几个有用的方法,大家可以自己翻翻源码去阅读,这里不再叙述


本教程所有源码在教程内,所以无附件
这个教程鸽了好久,最近放假,终于有时间更新了觉得对你有帮助就请评个分吧!



第一页 上一页 下一页 最后一页