课程时长:120 分钟
技术栈:IntelliJ IDEA + Spigot API 1.21.1 + AI 助手
核心目标:掌握远程投射物(Projectiles)的发射与控制,学习利用 BukkitRunnable 实现延时任务(如:火焰自动熄灭),构建一套完整的“技能释放 -> 效果产生 -> 环境恢复”的逻辑闭环。
一、 任务背景 (Mission Background)
普通的附魔剑已经无法应对日益强大的怪物。今天,你将化身为**“大魔导师”。你要利用“纸”作为媒介,注入元素力量,制作出三种法术卷轴**:
-
火球卷轴 (Fireball Scroll):右键向准星方向发射一颗巨大的火球,撞击处引发爆炸。
-
元素痕迹:火球爆炸后,地面会留下一圈持续 5 秒的“魔法火焰”,随后自动熄灭。
-
冰霜新星:让周围 5 格内的敌人瞬间陷入冰冻(减速)状态。
二、 学习路线图 (Technical Map)
-
编程技能:launchProjectile 发射投射物、BukkitRunnable (延时任务)、getNearbyEntities (范围搜寻)。
-
工程思维:清理机制 (Cleanup) —— 魔法产生的火如果永不熄灭,服务器会变成废墟。学会“负责任”的代码编写。
-
AI 素养:利用 AI 编写“球体/圆形范围判定”逻辑,并学习如何通过 AI 实现复杂的“状态检查”。
三、 核心项目:烈焰卷轴 (Sprint 1: 45 min)
1. 发射火球逻辑
我们要捕捉玩家手持特定纸张右键点击空气的动作。
推荐 Prompt(提示词):
“我正在使用 Spigot 1.21.1。请帮我写一个 PlayerInteractEvent 监听器:
检查玩家是否右键点击了空气或方块。
检查手中物品是否为名为‘§c火球卷轴’的纸张。
如果是,让玩家发射一个 Fireball(火球)。
设置火球的射速(yield)和方向。
消耗一张卷轴数量(amount – 1)。”
2. 代码解析:投射物 API
-
关键代码:p.launchProjectile(Fireball.class, p.getLocation().getDirection().multiply(2));
-
Vibe Check:问问 AI,为什么发射投射物通常要用 multiply(2)?(提示:默认初速度可能太慢,不符合“法术”的打击感)。
四、 多任务挑战:环境交互与清理 (Sprint 2: 45 min)
魔法不应该只是破坏,更应该包含“时间管理”。
五、 工程思维:资源循环与副作用处理 (Engineering Logic: 15 min)
工程师的深度思考:
-
世界保护:如果玩家在别人的领地乱放火球怎么办?
-
解决方案:在火球爆炸事件 (ProjectileHitEvent) 中增加区域权限检查。
-
-
垃圾回收 (Garbage Collection):
-
每一团火都是一个定时器。如果一秒钟产生了 100 团火,5 秒后 100 个定时器同时触发,会造成瞬间卡顿吗?
-
AI 任务:询问 AI “在处理大量定时任务时,如何有效地管理内存和 CPU 占用?”
-
六、 联机调试与 Debug (Testing: 15 min)
-
威力测试:火球能炸毁方块吗?(如果不想破坏地形,需要设置 fireball.setIsIncendiary(false))。
-
熄灭测试:放出火球后,盯着地面的火。倒数 5 秒,火是否如期消失?
-
多任务冲突:如果你一边跑一边蓄力,法术会自动打断吗?
-
AI 纠错:如果火球在发射瞬间炸到了玩家自己,请问 AI:“如何设置投射物的 Shooter 并忽略对发射者的初始碰撞?”
七、 自学习与探究 (Self-Learning)
拓展思考:
-
组合法术:如果先放“水卷轴”打湿敌人,再放“雷卷轴”,伤害能否翻倍?
-
自定义外观:能否利用 AI 获取代码,让火球飞行的过程中拖着一串长长的“末影粒子”?
八、 成果交付 (Deliverables)
-
演示:展示你手持不同卷轴,精准打击远处僵尸,并看到火焰在 5 秒后自动熄灭、世界恢复原样的完整过程。
-
代码截图:展示 BukkitRunnable 匿名内部类或 Lambda 表达式的代码部分。
-
Prompt 记录:记录你如何让 AI 实现“范围搜寻敌人并施加效果”的提示词。
九、 老师的 Vibe Tips (结语)
“今天你学习了时间的魔法。优秀的程序员不仅要考虑‘代码如何开始’,更要考虑‘代码如何优雅地结束’。利用 AI 帮你生成那些枯燥的坐标转换,你只需专注于设计法术的节奏感:多久爆炸?多久熄灭?这种对细节的掌控,就是法术卷轴的奥义所在。”