文章目录
前言
- 出这个系列是因为本人在学习插件开发的途中,发现很多资料不易寻找,也没有什么对入门好的理解,故此出此系列来丰富一下个人学习过程,记录开发过程,如果对你有帮助,别忘了点个赞,谢谢
- 基于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文章或者粉丝专享,因为内容真的很丰富,编码量很高,有意者关注收藏哦