我目前正在制作一个小小的RPG-Plugin,目前我正在尝试读出通过以下代码召唤的暴徒等级:
public static void summonMob(EntityType entTy, int level, World w, Location loc) {
Entity en = w.spawnEntity(loc, entTy);
en.setCustomName(ChatColor.RED + "Experiment One " + ChatColor.DARK_GRAY + "> " + ChatColor.GREEN + level
+ ChatColor.DARK_GRAY + " <");
}
然后在onEnable()中调用以进行测试:
summonMob(EntityType.ZOMBIE, 1, w, new Location(w, 238, 45, 1349));
&#34; test-mob&#34;我被传达了1级,我试图在以下事件中读出这些信息:
@EventHandler
public void onEntityDeath(EntityDeathEvent e) {
if (e.getEntity().getKiller() instanceof Player) {
Player p = e.getEntity().getKiller();
if (e.getEntity().getCustomName() != null) {
int mobLevel = Integer
.parseInt(ChatColor.stripColor(e.getEntity().getCustomName().replaceAll("[^\\d.]", "")
.replaceAll("[^\\p{L}\\p{Nd}]+", "").replaceAll("\\s+", "")));
p.sendMessage("You've slain a Level " + mobLevel + " enemie!");
}
}
}
问题是,虽然从自定义名称中删除了所有非数字,但最终整数总是加上&#34; 8&#34;的2倍,从1中获得818,在20中获得8208。
我可能在这里错过了一些简单的事情,如果有人可以帮助我的话会很棒。
答案 0 :(得分:2)
在其名称中存储一个怪物等级时,它可以在使用它时提取它。更好的解决方案可能是使用Bukkit的Metadatable系统。
该系统非常易于使用,可以通过以下方式完成:
当你产生暴徒时,你会以下列方式将一个值附加到暴徒身上:
en.setMetadata("level", new FixedMetadataValue(level));
当暴徒被杀时,您可以通过执行以下操作轻松提取值:
List<MetadataValue> data = e.getEntity().getMetadata("level");
if(data.isEmpty()) return;
int level = data.get(0).asInt();
这样,你就不需要复杂的字符串正则表来恢复你的等级。
答案 1 :(得分:1)
您可以使用net.minecraft.server代码创建自定义实体,但这在处理Minecraft更新时会出现问题,因为函数名称很可能会因混淆而更改。
你可以去反编译你正在使用的bukkit版本并查看bukkit类&#34; Entitie&#34;和那些相关的,搜索它们并试图找出它们的意思或谷歌一点&#34; bukkit&lt; release&gt;权利和#34;,这也可能对你有所帮助。
这也可以让你轻松地在你的实体上运行自定义代码,操纵寻路,行为,让他们对聊天/命令做出反应,让他们聊聊和运行命令,&lt; blahbla&gt; ......
我回家后立即寻找我的CustomVillager,因为我现在就在家里的大容器上放了所有这些东西,但我会在其中编辑它ASAP的