我的世界Bukkit插件开发-第四章-搭建基于spigot核心的服务器-自定义事件-终结您的好友......

前言

  • 出这个系列是因为本人在学习插件开发的途中,发现很多资料不易寻找,也没有什么对入门好的理解,故此出此系列来丰富一下个人学习过程,记录开发过程,如果对你有帮助,别忘了点个赞,谢谢
  • 基于Spigot核心的插件开发
  • 本章实现完成自定义一个恶搞玩家事件
  • 前置开发工具:IDEA
  • JDK环境-JKD-17
  • 构建工具:maven
  • 必备idea插件:Minecraft Development
  • 服务器核心: Spigot-1.20.jar
  • mc客户端
  • 手工码字不易,且看且珍惜,持续更新中…
  • 像我这样源码全出的作者不多了,快给个关注吧

一、功能需求分析

1.烧伤玩家

玩家进入游戏,我们计划使用岩浆对玩家进行持续烧伤
烧伤我们可以用岩浆来实现
具体步骤如下:

  • 获取玩家位置
  • 在玩家脚下生成岩浆
  • 防止玩家逃出岩浆
  • 防止玩家使用道具

2.生成怪物攻打玩家

玩家进入游戏,我们计划生成怪物攻打玩家
可以生成比较强力的怪物:
具体步骤如下

  • 获取玩家位置
  • 在玩家身旁生成怪物
  • 防止玩家逃脱怪物
  • 防止玩家使用道具

二、编写玩家连接后烧伤玩家

需要通过bukkit插件中的监听事件来实现

1.监听玩家连接世界

玩家连接时做出操作:我们需要建一个玩家操作事件类,来实现Listener接口,所有的事件都需要实现这个接口然后使用**@EventHandler注解来绑定方法为事件监听,需要在插件主类中注册此监听器,在插件启动时会扫描@EventHandler注解**的方法
我们使用Bukkit的插件管理类来注册事件监听器

public final class McHello extends JavaPlugin {
    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(new PlayerOperationEvent(), this);
    }
    @Override
    public void onDisable() {
    }
}


2.限制玩家移动

为了防止玩家逃出我们的岩浆范围,我们首先清空玩家的移速来控制玩家
在监听器中编写下列代码:

public class PlayerOperationEvent implements Listener {
    @EventHandler
    public void onPlayerJoinWorld(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        player.setWalkSpeed(0.0f); //设置玩家速度为0
    }
}

3.获取玩家位置和玩家所在世界

  • 我们使用监听器获取到玩家对象Player
  • 通过玩家对象获取玩家位置对象Location
  • 通过玩家位置对象获取世界对象World
public class PlayerOperationEvent implements Listener {

    @EventHandler
    public void onPlayerJoinWorld(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        player.setWalkSpeed(0.0f); //设置玩家速度为0
        Location location = player.getLocation(); //玩家位置
        World world = location.getWorld();//玩家所在世界
    }
}

4.在指定位置生成岩浆Entity

拿到玩家位置和世界位置后,我们就可以生成岩浆Entity
因为玩家的速度被我置为0,是动不了的,只能看着自己被灼烧

public class PlayerOperationEvent implements Listener {

    @EventHandler
    public void onPlayerJoinWorld(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        player.setWalkSpeed(0.0f); //设置玩家速度为0
        Location location = player.getLocation();
        World world = location.getWorld();
        if (world != null) {
            world.spawnEntity(location, EntityType.MAGMA_CUBE); // 在指定位置生成岩浆
        }
    }
}

5.嘿嘿嘿 岩浆来喽

  • 此时玩家还没意识到发生了什么,我们可以适当给一点提示
  • 嘿嘿嘿 岩浆来喽
  • 我们通过玩家对象来向聊天框发起对话,天冷了,多喝岩浆
public class PlayerOperationEvent implements Listener {

    @EventHandler
    public void onPlayerJoinWorld(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        player.setWalkSpeed(0.0f); //设置玩家速度为0
        Location location = player.getLocation();
        World world = location.getWorld();
        if (world != null) {
            world.spawnEntity(location, EntityType.MAGMA_CUBE); // 在指定位置生成岩浆
        }
        player.sendMessage(String.format("嘿嘿嘿 岩浆来了_来自顺心如意的问候,天冷了,多喝岩浆!"));
    }
}

6.防止玩家自救-清空玩家道具

  • 考虑到我们玩家可能存在多种物品足矣扑灭岩浆
  • 我们决定要把玩家的道具清空
  • 清空不可恢复,请自行选择
  • 我们定义一个方法来清空物品栏
public class PlayerOperationEvent implements Listener {

    @EventHandler
    public void onPlayerJoinWorld(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        player.setWalkSpeed(0.0f); //设置玩家速度为0
        Location location = player.getLocation();
        World world = location.getWorld();
        if (world != null) {
            world.spawnEntity(location, EntityType.MAGMA_CUBE); // 在指定位置生成岩浆
        }
        player.sendMessage(String.format("嘿嘿嘿 岩浆来了_来自顺心如意的问候,天冷了,多喝岩浆!"));
        //清空玩家物品栏
        clearInventory(player);


    }
    public void clearInventory(Player player) {
        Inventory inventory = player.getInventory(); //获取玩家物品栏对象
        ItemStack[] contents = inventory.getContents();//获取全部物品
        //置空物品
        for (int i = 0; i < contents.length; i++) {
            contents[i] = null; 
        }
        //空物品栏返给玩家
        inventory.setContents(contents);
        //更新玩家物品栏
        player.updateInventory();
    }
}

三、编写玩家重生后生成怪物暴揍

需要通过bukkit插件中的监听事件来实现

1.监听玩家重生事件

  • 重生后恢复玩家速度
  • 玩家装备进入时已经被清空,所以不需要再次清楚
  • 获取玩家位置,玩家世界,在玩家身旁生成一个监守者
  • 坚守者是比较厉害的怪物了,一定会暴揍
    @EventHandler
    public void onPlayerRespawn(PlayerRespawnEvent event) {
        // 玩家重生
        Player player = event.getPlayer();
        player.setWalkSpeed(0.1f); //恢复玩家速度
        Location location = player.getLocation();
        World world = location.getWorld();
        if (world != null) {
            location.setX(location.getBlockX()+2);//在x方向生成怪物
            world.spawnEntity(location, EntityType.WARDEN); // 在指定位置生成监守者Warden
        }
    }


2.嘿嘿嘿 暴揍来了

  • 同样的我们提示一句话
    @EventHandler
    public void onPlayerRespawn(PlayerRespawnEvent event) {
        // 玩家重生
        Player player = event.getPlayer();
        player.setWalkSpeed(0.1f); //恢复玩家速度
        Location location = player.getLocation();
        World world = location.getWorld();
        if (world != null) {
            location.setX(location.getBlockX()+2);//在x方向生成怪物
            world.spawnEntity(location, EntityType.WARDEN); // 在指定位置生成监守者Warden
        }
           player.sendMessage(String.format("嘿嘿嘿 怪物来了_来自顺心如意的问候,天冷了,别人暴富你被暴揍!"));
    }


四、运行插件

  • 在服务器目录 plugins下放置我们打的jar包启动服务器即可
    在这里插入图片描述

1.效果如下

  • 玩家加入游戏-触发岩浆事件
    在这里插入图片描述- 我们点击重生-触发监守者事件
  • 因为玩家复活是有声音的所以会监守者会攻击玩家
    在这里插入图片描述- 而且监守者自带黑天特性,压迫感十足
    在这里插入图片描述

2.每次重生都会生成一个坚守者,不知道你的朋友能不能顶得住

本章完

总结

提示:本章小结:持续更新中......
如果对您有帮助,别忘了收藏点赞评论留言,有问题评论区回答,后续继续更新插件相关文章
重要申明:作者接我的世界各种插件开发,有意者请留言,而且作者也有很多好玩的插件模式,比如pvp,单人特殊生存插件包,逃出生天等,后续会出一期pvp竞技场的搭建教程,可能会加入vip文章或者粉丝专享,因为内容真的很丰富,编码量很高,有意者关注收藏哦

  • 33
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值