Minecraft(我的世界)中文论坛

标题: 1.NMS简介

作者: asdfg25855    时间: 2016-8-18 17:14
标题: 1.NMS简介
本帖最后由 asdfg25855 于 2016-8-18 17:31 编辑
                        1.NMS简介

各位在处理某些插件的报错的时候经常会发现包含net.minecraft.server.1.x.x_Rx
的信息 即是我们要讲的NMS
NMS是包net.minecraft.server的简称
平时大家用的可能是官方提供的接口包org
而除了以上这两个包外 服务端还有另一个包CraftBukkit

1.三者大体关系
CraftBukkit的类实现了org中的接口,而NMS的对象包含在CraftBukkit中
比如:Org中的接口Player被CraftBukkit中的CraftPlayer实现,而CraftPlayer包含了NMS的EntityPlayer对象(如果晕的话,喝杯开水)

2.对他们进行操作
ORG的接口和CraftBukkit的类之间可以强转
CraftBukkit对象通过特殊方法getHandle()获得NMS对象
NMS对象通过getBukkitEntity()方法获得CraftBukkit对象

一段代码:
public static net.minecraft.server.Entity getAsNms(org.bukkit.entity.Entity orge){
                net.minecraft.server.Entity nmse;
                org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity ce=(CraftEntity) orge;
                nmse=ce.getHandle();
                return nmse;
        }
public static org.bukkit.entity.Entity getAsOrg(net.minecraft.server.Entity nmse){
                org.bukkit.entity.Entity orge;
                org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity ce=(CraftEntity)nmse.getBukkitEntity();
                orge=ce;
                return orge;
        }

So 我们可以从上获得信息:(以下简称CraftBukkit为CB)
1.三者是共通的
2.CB与NMS对象用过方法互访

3.nms类命名规则:
实体:nms会为所有实体加上-Entity前缀以区分
如:EntityPlayer EntityArrow
方块:nms会为所有方块加上-Block前缀以区分
如:BlockBeacon BlockBed
:nms会为所有包加上-Packet前缀以区分
如:PacketPlayOutNamedSoundEffect PacketPlayOutEntity
大体的看,从类名即可推测大部分类的属
4.内剖
以下是对nms下的Entity的部分截取
public abstract class Entity
/*      */   implements ICommandListener {
/*      */   private static final int CURRENT_LEVEL = 2;//正常变量
/*      */   private static int entityCount;//正常变量
/*      */   private int id;//正常变量
/*      */   public double j;//单字母变量
/*      */   public boolean k;//单字母变量
/*      */   public Entity passenger;//正常变量
/*      */   public Entity vehicle;//正常变量
/*      */   public World world;//正常变量
/*      */   public int getId(){
//正常方法
/*  129 */     return this.id;
/*      */   }
/*      */
/*      */   public void d(int i) {//单字母方法
/*  133 */     this.id = i;
/*      */   }
NMS类中的变量和方法普通情况下分为两种
一种是未经混淆等加密操作的正常方法和变量
一种是处理后的单字母变量和单字母方法 需要配合MCP解读



5.余话
请注意,有时在调用nms时,若出现空指针一类的错误,则会使服务器主线崩溃
导致服务器关闭,所以在写调用nms的代码时务必谨慎 如果能正确的运用nms 能为插件润色不少,但nms只是一个添色的工具,主画板还是org




该教程不定期更新.8(好气啊,写个帖的时间和重新排版的时间一样多)














作者: JackC92    时间: 2016-8-20 15:24
nms看起来是个好东西..可以做好多好玩的样子
作者: RE_OVO    时间: 2016-12-31 10:06
说起NMS,反射大法就要跳出来来装逼了
作者: 鸭蛋只吃黄    时间: 2016-12-31 11:34
jebme 发表于 2016-12-31 10:06
说起NMS,反射大法就要跳出来来装逼了

反射现在装不了了。我加了你的那个群,简直了
作者: q88724653    时间: 2017-4-29 13:01
NMS如何做到在一个插件添加多个服务端的版本,做到多版本兼容