[Java]Bukkit插件开发之实现进服给玩家物品

自定义物品并且将物品在进服的时候发送到玩家背包内

    本次开发使用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插件小教程就写到这里,感谢各位观众老爷们阅读!


    

猜你喜欢

转载自blog.csdn.net/qq_36376059/article/details/80384713