WERKXXT
实在脑瘫了!
尝试了很久如何获取玩家名字并对比
gettype getname getdisplayname
但是不管使用哪个都会出现报错
或者红色波浪线报错
希望大佬给个思路!或者提供一下代码!

_kayn
MCBBS有你更精彩~

_kayn
MCBBS有你更精彩~

零点星辰
Player player;
String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName();
String lingyige_name = "卢本伟";
boolean shi_fou_yi_yang = (name.equals(lingyige_name));

完事。我使用的是双持以上版本的获取主手物品方法, 如果你编写插件的API版本低于支持双持的游戏版本, 烦请自己找一下获取手上物品 ItemStack 的方法然后替换掉 getItemInMainHand().

南柯郡守
在你getType 之类的之前
你要判断玩家手上是不是有东西
if(item!=null&&item.getType!=Material.AIR){
//do something
}

WERKXXT
新科 发表于 2020-5-31 00:15
Player player;
String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName( ...

boolean那边是不是应该加个if?
感觉如果单加他只是输出

零点星辰
WERKXXT 发表于 2020-5-31 13:55
boolean那边是不是应该加个if?
感觉如果单加他只是输出

是的, 只是把布尔值结果存在了 shi_fou_yi_yang 里, 需要自己在下面判断
if (shi_fou_yi_yang) {
  // do something..
}

WERKXXT
新科 发表于 2020-5-31 00:15
Player player;
String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName( ...

并且使用if for都会出现红波浪 但是单加会出现后台报错
具体怎么使用能不能发一下全代码?

William_Shi
WERKXXT 发表于 2020-5-31 14:00
并且使用if for都会出现红波浪 但是单加会出现后台报错
具体怎么使用能不能发一下全代码? ...

player你要自己通过某种方法获得player
什么新建craftplayer什么的还是算了
常用的就是event.getPlayer这种

总之最上面那个player没初始化也不能帮你写出初始化的逻辑
你必须自己先获得一个player

比如说Player player = Bukkit.getPlayerExact("William_Shi");

William_Shi
WERKXXT 发表于 2020-5-31 14:00
并且使用if for都会出现红波浪 但是单加会出现后台报错
具体怎么使用能不能发一下全代码? ...

第二行是这样的
ItemStack都有NBT(二进制标签
最外层的是混合数据包
其中有一个display数据键对应一个混合数据包
这里面存储了displayname
也就是所谓的物品的名字

当然bukkit做了封装(ItemMeta),提供了操作lore、displayname等的方法
而不必触及nms
这里就是取出来物品的displayname

William_Shi
WERKXXT 发表于 2020-5-31 14:00
并且使用if for都会出现红波浪 但是单加会出现后台报错
具体怎么使用能不能发一下全代码? ...

后面的其他都没必要看,都是随便写的逻辑
具体使用需要你自己去判断

WERKXXT
William_Shi 发表于 2020-5-31 14:08
后面的其他都没必要看,都是随便写的逻辑
具体使用需要你自己去判断

请问大佬能否给一下具体的代码?
看完分析还是有点脑瘫和无法解决
谢谢

wangjj123
wolaihungejinli tishengkaatishegka

零点星辰
本帖最后由 新科 于 2020-5-31 20:15 编辑
WERKXXT 发表于 2020-5-31 16:38
请问大佬能否给一下具体的代码?
看完分析还是有点脑瘫和无法解决
谢谢 ...

首先要确认你的版本, 我上面代码使用了双持判断, 如果你插件的游戏版本不支持双持是一定会报错的。啊这, 忘记写空值判断了, 感谢评分提醒, 获取之前要先判断手上物体是否为空值, 是空值的话也会报错的
我代码的第一行其实只是告诉你, 接下来我用的 player 是一个 Player 对象, 具体你要代入进去
Player player;
这个 player 你可以理解为一个假设, 意思是“假设接下来涉及到的玩家变量是 player”.
因为这个语句中 player 并没有被赋予内容, 只是说填充了一个 Player 的"结构", 也就是没有后面的等于号, 那么我们就说这个变量没有被初始化.
如果你要使用这个变量, 你首先要找到内容 - (受害者)一个真实存在的玩家。

如果你是要在一个事件里面获取玩家手持物品名, 那么在方法里你就要先获取这个玩家的对象 event.getPlayer(), 然后你再去操作玩家。
那么就要使用


String 物品名 = event.getPlayer().getInventory().getItemInMainHand().getItemMeta().getDisplayName();


如果你是在命令里面要操作,那么同理,你要先获取到命令发送者 Sender 的玩家对象, 这里因为咱们的参数 sender 实际上是 CommandSender, 所以你需要在确保执行命令的人是玩家而不是控制台的情况下,进行从 CommandSender 类型到 Player 类型的强制转换 (Player) sender;


if ( sender instanceof Player ) {
    // 执行命令的人确实是玩家
    Player senderplayer = (Player) sender;
    String 物品名 = senderplayer.getInventory().getItemInMainHand().getItemMeta().getDisplayName();
}

这样应该够详细了吧...




Rukio
66666666666666666666

eessss
本帖最后由 eessss 于 2020-6-27 19:05 编辑

66666666手機修理666666666

第一页 上一页 下一页 最后一页