2016-01-09 2 views
1

В настоящее время я работаю над небольшой RPG-плагин, и на данный момент я пытаюсь зачитывает Уровень моба, который вызван через следующий код:Bukkit: Считать пользовательское имя Строка/Extract Integer

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)); 

«тест-моб» был вызван с 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!"); 
     } 
    } 

} 

Проблема, хотя все не цифры удаляются из пользовательского имени, конечное число всегда добавляет два раза в «8», что делает 818 из 1, и 8208 из 20

I» вы, вероятно, пропустили что-то простое здесь, и было бы здорово, если бы кто-то мог мне помочь.

ответ

2

При сохранении уровня мобов внутри его имени он может сделать извлечение жестким при его использовании. Лучшим решением может быть использование системы Bukkit Metadatable.

Эта система очень проста в использовании и может быть сделано следующим:

Когда вы икру вам моба, вы приложите значение черни следующим образом:

en.setMetadata("level", new FixedMetadataValue(level)); 

Когда моб slaim, вы можете легко извлечь значение обратно, выполнив:

List<MetadataValue> data = e.getEntity().getMetadata("level"); 
if(data.isEmpty()) return; 
int level = data.get(0).asInt(); 

Таким образом, вам не нужно делать сложные строки регулярных выражений, чтобы получить уровень назад.

1

Вы можете использовать код net.minecraft.server для создания пользовательских объектов, но это проблематично при работе с обновлениями minecraft, поскольку имена функций, скорее всего, будут изменены из-за обфускации.

Вы можете просто пойти и декомпилировать выпуск bukkit, который вы используете, и взглянуть на классы bukkit «Entitie» и те, которые связаны с ним, просмотреть их и попытаться выяснить, что они означают или Google немного для «bukkit < release> entitie nms», что может помочь вам.

Это также позволит вам легко запускать собственный код на ваши сущностях, манипулировать поведение, поиск пути, пусть они реагируют на чат/команду, пусть чат и выполнять команды, < blahbla> ...

Я Я буду искать свой CustomVillager, как только я вернусь домой, пока я нахожусь на лету, и у меня есть все такие вещи на моем большом складе дома, но я отредактирую его в ASAP.

+0

Спасибо! Поскольку мне еще не разрешено поднимать должности, мне пришлось выбрать решение Феррибига, поскольку оно было быстрее применено: 3 – AscendedKitten

Смежные вопросы