如何制作chrome插件raftBukkit插件

【原创教程】CraftBukkit插件汉化教程&-&Minecraft(我的世界)中文论坛 -
只需一步,立刻登录
后使用快捷导航没有帐号?
查看: 5678|回复: 35
【原创教程】CraftBukkit插件汉化教程
您尚未登录,立即登录享受更好的浏览体验!
才可以下载或查看,没有帐号?
本帖最后由 ny8302856 于
20:21 编辑
MineCraft Bukkit 水桶插件汉化教程
关于插件的汉化,我想一些基♂佬很期待这个了,咳咳,
准备工作:首先你必须有毅力,汉化一个插件要一定的时间,久了会产生厌烦感,导致放弃所以在汉化的同时也请出去呼吸新鲜空气保持好心情!233333还有一定的英语基础,什么叫汉化?就是将它国语言转变为中文,整个过程都要手打而且要有英语的基础噢~
GMD_GCD_1945.jpg (222.81 KB, 下载次数: 186)
20:09 上传
加油吧各位骚年~
& && &课题一:工具的完备汉化我们要用到两个工具群共享均有下载,群号为:
图片1.png (5.7 KB, 下载次数: 204)
20:11 上传
这是我们需要的hhclass工具。用于修改插件的文本信息
图片2.png (6.72 KB, 下载次数: 203)
20:12 上传
这个是我们在汉化同时的反编译工具,有的人可能光用hhclass纯汉化容易出错,所以我们用这个配合hhclass来做,确保汉化信息准确以及无差错
& && && && &课题二:内核汉化
一般插件的文件都是以class文件结尾,这里就要用到hhclass工具了
图片3.png (54.47 KB, 下载次数: 181)
20:12 上传
这些都是插件的文件,class文件结尾的,一般每个文件里面几乎都含有语言所以我们就要用hhclass打开他,比如我们要打开arena.class 这个根据我的初步判断应该是竞技场设置的模块,里面应该含有信息文件,接下来我们用hhclass打开他
图片4.png (43.79 KB, 下载次数: 184)
20:12 上传
以上就是打开hhclass工具的截图
接下来,我们点击打开class选择文件
选择后出现下图
图片5.png (40.34 KB, 下载次数: 181)
20:12 上传
好多不认识的代码!怎么办!
这时我们就要用到反编译工具像刚刚那样打开class文件会出现这个插件的源码:
图片6.png (39.29 KB, 下载次数: 181)
20:14 上传
这里就很清楚了,我们就可以在里面筛选比如有的文字前面写着:
图片7.png (2.79 KB, 下载次数: 185)
20:15 上传
sendMessage 就是发送信息相当于你在服务器中操作插件时,它完成一项工程,就会发信息说明XX已经成功XX了所以sendmessage后面引号中的语言就可以更改
还有的是没有sendmessage,这需要我们有一定的筛选能力
而且在汉化这个插件前一定要先熟悉这个插件!一定、!对插件比较了解了我们才可以去汉化,那样会增强准确性!减少错误的避免!
比如这个饥饿游戏插件,在开始游戏的时候要投票开始游戏,就会对玩家发出一个信息Please type /sg vote to start the game!这个是插件的特性,意思是请输入/sg vote 这个指令来投票开始游戏!我们就可以在反编译里面找到这段话
看到了吗,Votes to start game 就是投票开始游戏,这就是语言文件,既然我们筛选出来了语言信息我们就重新返回hhclass:
图片8.png (40.29 KB, 下载次数: 177)
20:21 上传
找到了吧?我们可以在下面的对话框里面更改咯,更改完了别忘点击替换噢否则会前功尽弃,如果这个class里面都汉化完了,就点击保存文件,才可以生效~有的插件有可能语言文件不在一个地方是分散的,所以要费心思去找了~
& && && && &课题三:yml文件汉化
有的插件是可以玩家自行更改信息文件的,比如我们在饥饿游戏插件的目录里面可以找到message文件,点开它:
图片9.png (104.5 KB, 下载次数: 185)
20:16 上传
这些都是我先汉化好了的饥饿游戏,后面的中文原来是英文,我们可以直接更改!不用使用任何工具!推荐使用N++文本文档来打开,对了有个非常重要!必须切记!
N++默认使用的中文编码是UTF-8!这个对Bukkit端是不支持的格式!所以我们汉化前要在N++里面,最上面找到这一栏
图片10.png (6.1 KB, 下载次数: 180)
20:14 上传
点击格式,使用ANSI格式!才可以的!
& && && &教程结束& && && && && && && && && && && &&&By:Miku_Dragon& && && && && && && && && && && &&&CraftBukkit插件汉化交流群:
很棒的作品!
谢谢楼主,看了你的教程我才会的.
很棒的作品!
Mcbbs有你更精彩~
Mcbbs有你更精彩~
多谢你的教程,言简意赅
Mcbbs有你更精彩~
在你交之前已经会了,还是给你人气.
很棒的作品!
码字辛苦了
帖子永久链接:&<button type="submit" class="pn" onclick="setCopy('http://www.mcbbs.net/thread--1.html', '帖子地址已经复制到剪贴板您可以用快捷键 Ctrl + V 粘贴到 QQ、MSN 里。')">点击复制Minecraft中文论坛 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖若有内容转载自其它媒体,不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予以删除并致以最深的歉意
7、管理员和版主有权不事先通知发贴者而删除本文
哇,看不懂啊
哇,你写的太高深了,我看不懂0.0
没办法,这些方法都是我自己摸索出来的,还有一些大神指点了,不然我也不可能会汉化&
哇,你写的太高深了,我看不懂0.0
没办法,这些方法都是我自己摸索出来的,还有一些大神指点了,不然我也不可能会汉化
若LZ用过mod一键汉化软件。就知道这种汉化已经old了.这种古老的方法。麻烦繁琐的很
mod一键汉化?我们这是插件= =而且汉化完发出来,成就感满满的&
若LZ用过mod一键汉化软件。就知道这种汉化已经old了.这种古老的方法。麻烦繁琐的很
mod一键汉化?我们这是插件= =而且汉化完发出来,成就感满满的
它们有同一种特点就是class.. 所以你这种汉化class的方法特繁琐.还累.
除了yml文本那些.直接可以用notepad 换码来汉&
mod一键汉化?我们这是插件= =而且汉化完发出来,成就感满满的
它们有同一种特点就是class.. 所以你这种汉化class的方法特繁琐.还累.
除了yml文本那些.直接可以用notepad 换码来汉
你不觉得那很容易出错吗,动了一个源码,你整个插件就废了&
它们有同一种特点就是class.. 所以你这种汉化class的方法特繁琐.还累.
除了yml文本那些.直接可以 ...
你不觉得那很容易出错吗,动了一个源码,你整个插件就废了
哇,好厉害!
好吧,说一句,
这似乎更简单
你是来砸场子的么= =&
感觉着貌似半原创半辅助的说
纯手打= =...&
哇,好厉害!
好吧,说一句,
你是来砸场子的么= =
提醒一下更简单的方法罢了。。&
感觉着貌似半原创半辅助的说
纯手打= =...
你是来砸场子的么= =
提醒一下更简单的方法罢了。。
表示那视频不太清楚&
提醒一下更简单的方法罢了。。
表示那视频不太清楚
表示从来都不直接查看class文件,一般都先反编译,找到language的包,直接改就行了
= =我们这样比较谨慎啦2333怕出错&
""以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。
版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。资料图鉴:教程速查:
当前位置:
我的世界插件制作详细图文教程 教你制作强大的CraftBukkit插件(4)
小编:铅笔时间: 21:27
  第 贰 章:主 类
  一、创建主类
  主类,顾名思义,是你插件的核心类,该类在插件内首先被CB加载,然后由其中代码加载其它类。
  这一节很简单,在你确定好插件的名字后,
  在包的主要位置下新建一个类,重命名为&&你的插件名&&即可
  (也可以用别的名字,为增强可读性,最好用插件名。IDE自动忽略后缀)。
  你必须要做的是使这个类继承CB的JavaPlugin类,例如
  Class &类名& extends JavaPlugin {
  复制代码
  若某一部分存在红色下划横线,表示无法识别该引用,点击该行最左侧的灯泡或者按Alt+回车完成导入(无法导入则说明不存在)。
  二、加载与卸载
  注:此处的卸载不同于卸载程序,只是在服务器中取消使用对应插件的功能。
  JavaPlugin下有两个方法,在插件被加载和卸载时被调用,它们分别是:
  onEnable() - 被加载时调用,onDisable() - 被卸载时调用;
  它们看起来应该象这样:
  public void onEnable(){
  //代码
  public void onDisable(){
  //代码
  复制代码
  (IDE会提示你添加@Override,但可有可无)
  三、用记录器输出文本
  Logger即为记录器,相当于你服务端所使用的命令提示符窗口(实际上不是),
  你使用它在控制台上输出消息,实用性比System.out.print()更好。
  JavaPlugin下有一个getLogger()方法,用于获取该插件的记录器。
  我认为你需要在你的插件被正常加载时显示对应消息,
  所以你应该用它来显示一段文本,例如:
  public void onEnable(){
  getLogger().info(&你的插件已被加载!&);
  public void onDisable(){
  getLogger().info(&你的插件已被卸载。&);
  复制代码
  当你把以上三个步骤弄完后,你的主类看起来应该是这个样子:
  package xxx.xxxxxxx.xxxxxx.
  import java.util.logging.L
  import org.bukkit.plugin.java.JavaP
  public class &类名& extends JavaPlugin {
  public void onEnable(){
  getLogger().info(&你的插件已被加载!&);
  public void onDisable(){
  getLogger().info(&你的插件已被卸载。&);
  复制代码
  四、与Vault挂接
  ※ 无需权限、聊天、经济系统挂接的插件可以跳过此步骤
  这个先搁置,等配置文件写完后再写这个
  五、创建plugin.yml
  在缺省包(包路径为空)下创建一个YAML文件,命名为plugin.yml。
  以下内容必须含有,输入它们:
  name: &你的插件名名&
  main: &包路径&.&主类&
  version: &插件版本号&
  复制代码
  例如:
  name: MyPlugin
  main: com.mydomain.myplugin.MyPlugin
  version: 1.0
  复制代码
  由于包路径下主类的底层包名很可能为插件名,所以在main这一设置中见到插件名重复的情况很正常,这也可能是导致你出错的地方
  详细设置见官方WIKI:http://wiki.bukkit.org/Plugin_YAML
分享到:更多
类型:休闲娱乐平台:PC,iOS,安卓
游戏大礼包手游开测表
挂机吧主公五四土豪青年礼包九阴真经3D五四大好青年礼包《皇图》五四青年节礼包HIT:我守护的一切五一限量金币礼包《口袋妖怪复刻》五一节礼包笑傲天龙五一飞速升级礼包
05-16公测05-04内测04-29内测04-28公测04-23公测04-22内测04-22封测04-14公测04-13公测04-07公测
攻略推荐本月最新
手游排行网游单机[原创]CraftBukkit插件制作教程 —— 第叁章:监听器[]&-&Minecraft(我的世界)中文论坛 -
只需一步,立刻登录
后使用快捷导航没有帐号?
查看: 15460|回复: 37
[原创]CraftBukkit插件制作教程 —— 第叁章:监听器[]
您尚未登录,立即登录享受更好的浏览体验!
才可以下载或查看,没有帐号?
本帖最后由 +倒霉の忍者+ 于
16:23 编辑
游客,本帖隐藏的内容需要积分高于 20 才可浏览,您当前积分为 0
解决了我许多瞎学留下的后遗症,感谢十分.
表示学C++的写插件有点麻烦
楼主是@EventHandler(priority = EventPrio.
Mcbbs有你更精彩~
帖子永久链接:&<button type="submit" class="pn" onclick="setCopy('http://www.mcbbs.net/thread-.html', '帖子地址已经复制到剪贴板您可以用快捷键 Ctrl + V 粘贴到 QQ、MSN 里。')">点击复制Minecraft中文论坛 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖若有内容转载自其它媒体,不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予以删除并致以最深的歉意
7、管理员和版主有权不事先通知发贴者而删除本文
本帖最后由 +倒霉の忍者+ 于
21:07 编辑
留着备用的
卤蛋你丫的才灌水呢↓
本帖最后由 +倒霉の忍者+ 于
21:07 编辑&
虽不明,但觉厉
唉...其实每次都是憧憬地走进这些教学贴,然后失望地走开...
没办法呢...谁叫我们知识有限...看也看不懂咩...也有细心看...可是就是
看不懂呢...也许是厌学心理吧..每次看到这些..就觉得头疼。
之前SimCity的插件我也是学了好久才会。
可是这个怎么就TA丫的看不懂TAT
我觉得我这种天生的傻蛋还是靠边走吧。
刚开始看代码总会觉得难受的,更别说英文教程了&
还是佩服楼主的耐力啊..
总觉得或许我说的话是错的。
天赋可能某些人要强一些。
可是怎么觉得自己没去努力呢...
虽说 世上无难事 只怕有心人
但是我或许就是个无心人...
某些时候咬咬牙也能学到……
感兴趣做起来就不会无聊了,如果不感兴趣那么能不做则不做&
慢慢琢磨...&
希望楼主早日更新,~辛苦了~
....不会5555楼主怎么获得服务器在线人数
Server接口下有个方法可以获得&
表示光是翻译bukkit的 类 都要把我的脑子弄爆了!
不要翻译,知道是什么意思就好,尽量用英文去理解,否则你将有一半的时间用在翻译上,效率几乎为0&
主要是想翻译到MCBBS上...但是实在是太多了= =所以还是算了吧
不要翻译,很多内容是中文难以说明的&
谢谢楼主分享!
本帖最后由 a 于
23:44 编辑
ありがとうございます
Lz 你的New Mylistener()package xxx.xxxxxxx.xxxxxx.import java.util.logging.Limport org.bukkit.plugin.java.JavaPimport xxx.xxxxx.xxxxx.xxxx.MyLpublic class MyPlugin extends JavaPlugin {& & public void onEnable(){& && &&&getServer().getPluginManager().registerEvents(New MyListener(), this);& && &&&getLogger().info(&你的插件已被加载!&);& & }& & public void onDisable(){& && &&&getLogger().info(&你的插件已被卸载。&);& & }}复制代码找了好久都不知道哪里出问题,结果是New要小写丫
多谢你的提醒,如果你学过JAVA就会知道,这是用来创建实例的&
小本 发表于
Lz 你的New Mylistener()找了好久都不知道哪里出问题,结果是New要小写丫
多谢你的提醒,如果你学过JAVA就会知道,这是用来创建实例的
0.0学习{:10_512:}
{:10_566:}大触简直无情,表示才java初学
""以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。
版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。红软基地:您身边最放心的安全下载站!
您所在的位置:&>&&>& > 我的世界1.7.2[MCPC+][CraftBukkit]mod服务端小修整合1.0
我的世界1.7.2[MCPC+][CraftBukkit]mod服务端小修整合1.0
游戏语言:
游戏官网:
游戏大小:
游戏类型:
游戏评级:
更新时间:
同类推荐游戏
我的世界1.7.2[MCPC+][CraftBukkit]mod服务端小修整合1.0这是一款休闲益智类型的游戏下载,我的世界1.7.2[MCPC+][CraftBukkit]mod服务端小修整合1.0(My world 1.7.2 [MCPC +] [CraftBukkit] 1.0 mod server minor repair integration)属于3D的第一人称和第三人称沙盒游戏,游戏所呈现的世界并不是华丽的画面与特效,而是注重在游戏性上面。
中文游戏名称:我的世界1.7.2[MCPC+][CraftBukkit]mod服务端小修整合1.0
英文游戏名称:My world 1.7.2 [MCPC +] [CraftBukkit] 1.0 mod server minor repair integration
游戏所属平台:电脑PC版
游戏更新日期:
游戏所属类型:休闲益智
游戏所属版本:V1.7.2
我的世界属于3D的第一人称和第三人称沙盒游戏,游戏所呈现的世界并不是华丽的画面与特效,而是注重在游戏性上面。这与现在的大作走的一个完全相反的方向,不过正是这样该游戏取得了巨大的成功。
玩家在游戏中做着建设,破坏等等许多事,透过像乐高一样的积木来组合与拼凑,轻而易举的就能制作出小木屋、城堡甚至城市,但是若再加上玩家的想象力,天空之城、地底都市都一样能够实现。
玩家不仅可以创造房屋建筑,甚至可以创造属于自己的都市和世界,玩家可以通过自己创造的作品来体验上帝一般的感觉。
我的世界1.7.2[MCPC+][CraftBukkit]mod服务端小修整合1.0插件:基础插件,[防爆]AntiCreeper ,[结婚]LoveLife-1.7.2 ,Ancient_Gates ,AuthMe 登陆插件,AutoRestart自动重启插件(注:不懂用的就删掉 不然会自动关服),AutoSaveWorld自动保存插件 ChestShop 箱子商店。
[1.7.2]mod版服务端小修整合小修整合让成为腐竹的梦更快实现!
[防爆]AntiCreeper
[结婚]LoveLife-1.7.2
Ancient_Gates
AuthMe 登陆插件
AutoRestart自动重启插件(注:不懂用的就删掉 不然会自动关服)
AutoSaveWorld自动保存插件
ChestShop 箱子商店
Clearlag 清理插件
CreeperHeal防爆插件
CreeperHeal苦力怕爆炸保护
iConomy经济插件
Jobs工作插件
Lockette锁箱子插件
LoginTeleport 固定的上线地点
NoSpawnChunks清除冗余块插件
Residence 领地插件
SignShop木牌指令
Vault前置插件
WorldEdit 创世神
YuLeMotd标语插件
掉落物品清理
SignShop木牌指令
《我的世界1.7.2[MCPC+][CraftBukkit]mod服务端小修整合1.0》这款游戏属于休闲益智栏目,由红软基地网友分享于,本文网址为:/game/18668.html
上一页: 下一页:
类似游戏推荐
:我的世界1.7.2[CB]knight系列服务端整合懒人包这是一款休闲益智类型的游戏下载,我的世界1.7.2[CB]knight系列服务端整合懒人包(My world 1.7.2 (CB) knight series server consolidation package is for lazy people)属于3D的第一人称和第三人称沙盒游戏,游戏所呈现的世界并不是华丽的画面与特效,而是注重在游戏性上面。
:我的世界1.7.2米菲做地图向整合包这是一款休闲益智类型的游戏下载,我的世界1.7.2米菲做地图向整合包(My world 1.7.2 miffy do map to the integration of the package)属于3D的第一人称和第三人称沙盒游戏,游戏所呈现的世界并不是华丽的画面与特效,而是注重在游戏性上面。
我的世界1.7.2[MCPC+][CraftBukkit]mod服务端小修整合1.0
休闲益智下载排行
热门关键词
热门游戏推荐在Bukkit里,如何自定义实体、怪物的行为呢?
本文用魔改牛牛君为例,介绍了两种如何怪物、生物的行为AI的方法。
一、设想效果
在我设想的效果中,自定义的怪物是多种多样的。同一个怪物模型,不同的怪物等级,拥有不同的AI。举个简单的例子。
普通僵尸:见到玩家会追击和攻击
懒惰的僵尸:见到玩家不会主动追击,除非玩家攻击他。
胆小的僵尸:见到玩家就会逃跑。
变异的僵尸:不惧怕太阳照射。
以上的这几个僵尸例子,就是使用同一个怪物模型(僵尸),不同的AI实现。
而要达成这个想法,使用我翻译的那篇文章显然是不可能的。
在我们自定义怪物的时候,只能自定义已有怪物的AI,而不能修改他们的材质或模型,因为那样的话客户端无法正常显示。
二、研究Minecraft底层中Entity的工作
为此,我专门翻阅了Entity在底层中是如何工作的。
简单来说,Entity包含很多种,而我们的怪物或者是动物的父类是LivingEntity(活性实体)
而LivingEntity之中包含了该实体的AI部分处理。
在上图中,tasks和targetTasks都是实体的AI表,而每个AI表都存在多个AI处理器。
如图是实体僵尸的所有AI,定义了僵尸会游泳, 攻击,监视附近的玩家,以及主动攻击玩家,村民和铁傀儡。首先攻击伤害自己的单位。
而我们的工作就是把这些AI全部修改掉,然后修改成我们自定义的AI。
大约就是 entity.tasks.clear() 和 entity.targetTasks.clear() 这么简单。
每个具有AI的实体都是由World来进行刷新的(每Tick一次 / Tick = 1/20s)
三、魔改牛牛君
众所周知,牛牛菌属于动物,是不会攻击任何生物/怪物 或玩家的。而我们要做的是一个疯狂的牛牛菌,他攻击鸡鸡菌。
为了简化,我简单写了一个插件,然后注册了一个命令叫做mobs,下面我开始onCommand里魔改牛牛菌:
只有简单的几行,我们就可以创建出一个独一无二的,拥有独立AI的牛牛菌。(正常的牛不会受到影响)
第一步、获取Server/World的NMS实例
我们通过CommandSender获得Player(当然Console是不可以使用这个指令的)
关键的第一步我们要获得WorldServer,而对于这个WorldServer,我要进行一下解释:
大家可能都知道Bukkit的World,他代表了一个世界。而如果你深究他是如何实现的,你会发现真正实现它的是CraftBukkit的CraftWorld,而CraftWorld封装了WorldServer。
对于这三者的关系是这样的。
WorldServer是原生的,血脉纯正,MOJANG写的。
CraftWorld 是非官方组织开发的,属于CraftBukkit,封装了WorldServer。
而Bukkit的World只是一个接口,他真正的实现类是CraftWorld。
所以我们通过World强转获得CraftWorld,而通过CraftWorld的getHandle()获得WorldServer的实例
第二步、创建一个实体。
创建实体的步骤很简单,实例化一个实体类。将这个实体类添加到世界中。(如果不添加到世界中则不会显示和刷新AI)
实例化需要提供一个WorldServer作为参数。
第三步、删除实体的AI,让他变白痴。
删除实体的AI,重新实例化一个PathfinderGoalSelector,并覆盖掉实体原来的PathfinderGoalSelector。
新的PathfinderGoalSelector是空的,所以相当于置空了实体的AI列表。
这样做,会让疯狂的牛牛菌变成一个白痴。你打他,他没反应。你把他推到水里,他会沉底。你拿着小麦在他面前晃悠,他无视你。
他不会走动,不会转头。攻击他也不会惊慌失措的逃跑。
PathfinderGoalSelector 是AI列表(具体请看最后解释)
第四步、重新制作牛牛菌的脑子。
下一步就是重新制作牛牛菌的脑子了,我们的目标是: 让牛牛菌主动攻击鸡
你可以看到在上图的代码中,我给他添加了一个名为AIAtk的AI处理器,没错,这个AIAtk是我自己写的一个AI处理器。他会让实体攻击其他实体。
AIAtk完全仿照PathfinderGoalMeleeAttack ,PathfinderGoalMeleeAttack貌似不能为动物所用,无效果,我还没研究透彻。不清楚哪里限制了这个AI处理器不能为动物所用,所以我写了一个AIAtk,完全复制PathfinderGoalMeleeAttack的代码,但是在伤害计算部分是直接进行伤害的
随后我给他的目标选择器targetSelector添加了一个主动攻击近处的目标的AI处理器,而目标设定为EntityChicken鸡鸡菌。
你可以用PathfinderGoalMeleeAttack替代AIAtk,结果是牛追击鸡,但是不会造成伤害。
第五步、开服测试
首先我通过指令mobs生成了一个疯狂的牛牛菌,它现在是半脑残状态,因为我移除了它自由移动的AI,所以它只会站着不动。面对我们的镜头,一点也不紧张。
一墙之隔,就是一只正常的鸡鸡菌,它是我用刷怪蛋刷出来的。它拥有健全的大脑,它会监视离它太近的单位(玩家)。有玻璃挡着,它们安然相处。
而当我把玻璃破坏一个口,牛牛菌疯一般的跳过来,然后几脚就把这只可怜的鸡鸡菌踩死了。(如图鸡受到伤害)
很棒,我们实现了牛牛菌的大脑重制。
这对实现多样化的怪物AI有极大的帮助。
设想一下,我们可以让僵尸拥有更高的智慧:
他们可以有仇恨值,可以召唤其他僵尸到来。可以指挥其他僵尸攻击某一个单位。
而动物们,也不再是任人宰杀了,他们可以反击,追击和远远的逃跑。
而BOSS也不只是末影龙和凋零了,有了强大的AI系统,任何一个生物,哪怕是小鸡,也可以成为一个恐怖的,拥有强大技能和AI的终极BOSS。
四、区块卸载重加载时,怪物的自定义行为就会被清空。
原因就是当区块卸载时,怪物的数据就会以NBT的形式保存在Chunk区块文件中,而我们自定义的行为并不在保存的数据之列,也就被理所当然的刷了下去。当区块再加载,怪物从区块文件中读取出来并重新实例化时,我们的自定义行为就消失了。
我不确定这个问题是否和版本有关,我在1.9.4版本下进行的测试。
为了解决这个问题,我们有几种解决方案:
1、修改Entity的NBT序列化过程,把我们的自定义行为写到数据文件中。
2、记录Entity的UUID作为唯一标识,将自定义行为存储在其他地方,当怪物重新被加载时,重新将自定义行为写到怪物身上。
看上去显然第一条比较复杂,修改服务器端需要很大的功夫,也比较麻烦。现在采用第二种方案来修复这个BUG。
通过ChunkLoadEvent来监听区块被加载的事件,然后对这个区块上所有实体进行检测。需要注意的是,ChunkLoadEvent这个事件是异步的,你在监听到事件后马上getEntities()是只会返回空的,所以你需要延迟一段时间再获取,比如:
Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin,Runnable,40L);
我们获取了刚加载的所有怪物的列表,然后依次判断他们的UUID是否在我们的插件数据库中有记录,如果有记录,根据记录对其的AI进行设置。
如果觉得好麻烦,请使用下面这种方法。下面这个就不会遇到这种问题。
五、使用反射更自由化的操控AI
“这个方法因为原理不同,所以不会遇到上面第四节所说的BUG”
其实还有一种更彻底的操控方法,就是替换掉Minecraft原生的AI操作类,替换成我们的AI类。
EntityTypes(EntityList)中定义了所有实体的类型、ID和对应的处理类。我们通过反射来篡改Minecraft注册的类,来替换成我们的类。
这个方法虽然复杂一些,但是更自由。
如上图,通过直接获取EntityTypes的Field进行修改来达成目的。
我修改了实体列表中的EntityPig类为我自己的Pig类。
我自己写的Pig类继承了EntityPig这个原生的AI类,这样一来我们只需要修改想改变动的部分就可以了。
在我创建的Pig类中,在其生成的时候输出一句话来证明实体猪的创建,最终实例化的是这一个类。
(这里忘记运行截图了)
EntityTypes = EntityList
它们是同一个类,但是MCP和CraftBukkit反混淆时给他们起了不同的名字
由于对Minecraft源码的研究我是通过MCP来完成的,CraftBukkit的反混淆不彻底无法进行研究。故在本文中出现了MCP反混淆时命名的类名
他们和CraftBukkit的命名有明显的插件,故作此解释:
本文中的实体列表类,在MCP的反混淆中叫做EntityAITasks,在CraftBukkit的反混淆中叫做PathfinderGoalSelector。实体AI处理器在MCP中被命名为EntityAIXXXX,而在CraftBukkit中则被命名为 PathfinderGoalXXXX。他们的意思都是一样的。同样的,EntityList(MCP)和EntityTypes(CraftBukkit)也是这样的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:102次
排名:千里之外

我要回帖

更多关于 如何制作eclipse插件 的文章

 

随机推荐