自定义物品并且将物品在进服的时候发送到玩家背包内
本次开发使用IntelliJ IDEA开发,spigot版本为1.12.2,JDK版本为1.8。
那么废话不多说,咱们直接进入插件的编写。
首先第一步,我们先创建好插件基本所需的包
然后我们把plugin.yml类跟插件主类写好
TestPluginMain.java(插件主类)
package org.cherrygods.main; import org.bukkit.ChatColor; import org.bukkit.plugin.java.JavaPlugin; public class TestPluginMain extends JavaPlugin { @Override public void onDisable() { getServer().getConsoleSender().sendMessage(ChatColor.GREEN+"CustomItems&onJoinServer has been Disable!"); super.onDisable(); } @Override public void onEnable() { getServer().getConsoleSender().sendMessage(ChatColor.GREEN+"CustomItems&onJoinServer has been Enable!"); super.onEnable(); } }
plugin.yml(插件配置文件)
name: TestPlugin main: org.cherrygods.main.TestPluginMain author: CherryGods version: 1.0
然后我们再在items包里写一个Items类
Items.java(存放Item)
public class Items { //获取Items方法,返回一个ItemsStack对象 public ItemStack getItem(String itemName) { //请无视我为什么要用中文,这样好理解,实际开发中请使用英文。 if(itemName.equalsIgnoreCase("回血书")){ ItemStack 回血书 = new ItemStack(Material.BOOK, 1); ItemMeta meta = 回血书.getItemMeta(); meta.setDisplayName("§c回血书"); ArrayList lore = new ArrayList(); lore.add("§b手持回血,每秒回血1滴血"); meta.setLore(lore); meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); 回血书.setItemMeta(meta); return 回血书; }else if (itemName.equalsIgnoreCase("升级宝石")){ ItemStack 升级宝石 = new ItemStack(Material.DIAMOND,1); ItemMeta meta = 升级宝石.getItemMeta(); meta.setDisplayName("§a升级宝石"); ArrayList lore = new ArrayList(); lore.add("§b手持该物品持续加经验,每0.5秒加1经验"); meta.setLore(lore); meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); 升级宝石.setItemMeta(meta); return 升级宝石; } return null; } }
那么我们现在已经有Item了,我们现在要做的就是在玩家进入服务器时将Item放入玩家背包中
public class GiveItemsOnPlayerJoinServer implements Listener { private Items items = new Items(); @EventHandler public void onPlayerJoinServer(PlayerJoinEvent event){ //这里是遍历进服玩家的背包 for(int i=0;i<event.getPlayer().getInventory().getSize();i++){ //判断如果玩家背包里面不存在回血书那么久就执行 if(!event.getPlayer().getInventory().contains(items.getItem("回血书"))){ //往玩家背包里放入一个回血书 event.getPlayer().getInventory().addItem(items.getItem("回血书")); event.getPlayer().sendMessage(ChatColor.AQUA+"你获得了一本回血书!"); }else if(!event.getPlayer().getInventory().contains(items.getItem("升级宝石"))){ event.getPlayer().getInventory().addItem(items.getItem("升级宝石")); event.getPlayer().sendMessage(ChatColor.AQUA+"你获得了一颗升级宝石!"); } } } }
既然监听类写好了,那么我们就在主类的onEnable方法里注册这个监听器吧
@Override public void onEnable() { getServer().getConsoleSender().sendMessage(ChatColor.GREEN+"CustomItems&onJoinServer has been Enable!"); getServer().getPluginManager().registerEvents(new GiveItemsOnPlayerJoinServer(),this); super.onEnable(); }
那么我们加载插件,看看实际效果如何
扫描二维码关注公众号,回复:
1074822 查看本文章
退服之前背包状态
进服之后的提示
物品的属性
突然想到,既然我们都给物品上写了这几段字了,那么为什么我们不直接实现这功能呢?
说干就干,首先我们要想该怎样实现手持回血书就回血呢?
我提供一个思路:用BukkitRunnable进行循环读取在线玩家的手上的物品是否为回血书或者是升级宝石。
既然思路有了,那么我们就开始写代码吧
首先我们先在主类new BukkitRunnable并且实现run方法
我们创建一个runTask()方法,在里面实现我们要做的功能(记得在主类new Items对象)
记得要把runTask()放进onEnable()里面喔!
public void runTask(){ new BukkitRunnable() { @Override public void run() { //遍历当前服务器所有在线的玩家 for (Player player : Bukkit.getOnlinePlayers()) { //判断玩家手上的物品是否为咱们自定义的Item if (player.getItemInHand().isSimilar(items.getItem("回血书"))) { //这里是要判断玩家的血量有没有超过最大血量,如果不加这个判断会报错,原因是血量持续增加但是最高血量就是20 if (player.getMaxHealth()-player.getHealth()>1) { //设置玩家的血量为当前血量+1 player.setHealth(player.getHealth() + 1); } else { player.sendMessage(ChatColor.YELLOW + getName() + " >> " + ChatColor.RED + "Your health has max!"); } } } //这里是设置延迟,有个java基础的应该都懂 } }.runTaskTimer(this, 10, 10); new BukkitRunnable(){ @Override public void run(){ for (Player player : Bukkit.getOnlinePlayers()){ if(player.getItemInHand().isSimilar(items.getItem("升级宝石"))){ player.giveExp((int) (player.getExp()+1)); } } } }.runTaskTimer(this,10,10); }
那么我们现在进游戏测试一下,到底有没有用!
回血书
升级宝石
好了,本次的Bukkit插件小教程就写到这里,感谢各位观众老爷们阅读!