Помогите Получить цифру из неймтега моба

Статус
Закрыто для дальнейших ответов.

shitcode1337

Новичок
Пользователь
Баллы
6
Имя в Minecraft
shitcode227
Есть у меня скелет, у него стоит кастомный неймтег, допустим Скилетон-Братишка [1]
Как получить это число из скобок?
 
PHP:
    @EventHandler
    public void OnMobKill(final EntityDeathEvent e) {
        if(e.getEntityType() != EntityType.PLAYER && e.getEntity().isCustomNameVisible()) {
            Player p = e.getEntity().getKiller();
            String string = e.getEntity().getCustomName();
            Integer amount = Integer.parseInt(string.replaceAll("[\\D]", ""));
            Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + amount);
        }
    }
Пробывал так - не работает, ошибок в консоле нет.
 
Разобраться в базовых регулярных выражениях поможет эта страница:
http://www.vogella.com/tutorials/JavaRegularExpressions/article.html

Тебе нужно создать Pattern, пропарсить строку, тем самым получив Matcher, из Matcher'а получить группу (строку), которая тебе нужна (число в скобках), и перевести ее в число (Integer.parseInt(String str)). Хочу заметить, что String#replaceAll заменяет базируясь на регулярном выражении, а символы '[' и ']' являются частью его синтаксиса, а не как обычные символы, чтобы определить их как обычные, нужно записывать через слеши: "\\[".

Паттерн здесь может быть примерно такой: "\\[(\\d+?)\\]". Это для способа, который я описал выше.

P.S. Я понял, что там способ как замена НЕ цифровых символов на пустоту. Может быть без [ ] пойдет. В любом случае лучше создавать более устойчивый вариант, т.к. в названии могут быть числа в других местах (вдруг придется так сделать). Так же фразы "не работает" - бесполезные, если нужна адекватная помощь.
 
Последнее редактирование:
PHP:
       Pattern patern=Pattern.compile("[-]?[0-9]+(.[0-9]+)?");
       Matcher matcher=patern.matcher(string);
       Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + Integer.parseInt(matcher));
Я совсем тугой, написал какой то бред, а его проверить даже не могу, т.к незнаю как мне его теперь вывести 😠
 
PHP:
       Pattern patern=Pattern.compile("[-]?[0-9]+(.[0-9]+)?");
       Matcher matcher=patern.matcher(string);
       Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + Integer.parseInt(matcher));
Я совсем тугой, написал какой то бред, а его проверить даже не могу, т.к незнаю как мне его теперь вывести 😠
 
Код:
 Pattern patern=Pattern.compile("\\\\[(\\\\d+?)\\\\]");
       Matcher matcher=patern.matcher(string);
а как мне вывести, не доходит, уже всё что эклипс предлогал попробывал - не работает

Код:
        String onlynum=string.replaceAll("[^0-9]+", "");
        Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + Integer.parseInt(s1));
попробывал ещё так, но что то пошло не так
 
Последнее редактирование:
Код:
 Pattern patern=Pattern.compile("\\\\[(\\\\d+?)\\\\]");
       Matcher matcher=patern.matcher(string);
а как мне вывести, не доходит, уже всё что эклипс предлогал попробывал - не работает

Код:
        String onlynum=string.replaceAll("[^0-9]+", "");
        Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + Integer.parseInt(s1));
попробывал ещё так, но что то пошло не так
Тебе скинули статью с хабра
 
Код:
        Pattern patern=Pattern.compile("\\\\[(\\\\d+?)\\\\]");
        Matcher matcher=patern.matcher(string);
        Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + Integer.parseInt(matcher.group()));
Как я понял, это правильный вариант кода, но не работает.
 
Последнее редактирование:
Код:
        Pattern patern=Pattern.compile("\\\\[(\\\\d+?)\\\\]");
        Matcher matcher=patern.matcher(string);
        Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + Integer.parseInt(matcher.group()));
Как я понял, это правильный вариант кода, но не работает.
Много слешей.
group(1)
 
Много слешей.
group(1)
Код:
@EventHandler
public void OnMobKill(final EntityDeathEvent e) {
    if(e.getEntityType() != EntityType.PLAYER) {
        Player p = e.getEntity().getKiller();
        String string = e.getEntity().getCustomName();
        Pattern patern=Pattern.compile("\\[(\\d+?)\\]");
        Matcher matcher=patern.matcher(string);
        Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + Integer.parseInt(matcher.group(1)));
    }
}
Убиваю зомби с неймом 'zxc [123]' ничего не происходит.
 
Понял что сам эвент не работает, но другие эвенты в этом классе работают..
 
Решено, эвент заработал, но после проверки
if(e.getEntityType() != EntityType.PLAYER) {
ничерта
 
ошибка
PHP:
[21:16:27] [Server thread/ERROR]: Could not pass event EntityDeathEvent to BossFight v0.1
org.bukkit.event.EventException: null
   at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEntityDeathEvent(CraftEventFactory.java:395) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.EntityLiving.die(EntityLiving.java:1116) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.EntityZombie.die(EntityZombie.java:429) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:956) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.EntityMonster.damageEntity(EntityMonster.java:44) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.EntityZombie.damageEntity(EntityZombie.java:163) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.EntityHuman.attack(EntityHuman.java:1005) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.EntityPlayer.attack(EntityPlayer.java:1311) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1623) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.PacketPlayInUseEntity.a(SourceFile:69) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.PacketPlayInUseEntity.a(SourceFile:13) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_181]
   at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_181]
   at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   at java.lang.Thread.run(Unknown Source) [?:1.8.0_181]
Caused by: java.lang.IllegalStateException: No match found
   at java.util.regex.Matcher.group(Unknown Source) ~[?:1.8.0_181]
   at lco.ezsc.bossfight.Levels.OnMobKill(Levels.java:134) ~[?:?]
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_181]
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_181]
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_181]
   at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_181]
   at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-dcd1643-e60fc34]
   ... 23 more
 
Код:
@EventHandler
public void OnMobKill(final EntityDeathEvent e) {
    if(e.getEntityType() != EntityType.PLAYER) {
        Player p = e.getEntity().getKiller();
        String string = e.getEntity().getCustomName();
        Pattern patern=Pattern.compile("\\[(\\d+?)\\]");
        Matcher matcher=patern.matcher(string);
        Levels.o4ki.put(p.getName(), Levels.o4ki.get(p.getName()) + Integer.parseInt(matcher.group(1)));
    }
}
Убиваю зомби с неймом 'zxc [123]' ничего не происходит.
Если у тебя цифра будет в конце в скобках ([]), то просто как-то так
PHP:
public int getInt(String s) throws NumberFormatException {
  int number = 0;
  boolean parsing = false;
 
  //Никогда раньше не писал таких итераторов, может пропускать один символ, там уже сам поправишь
  for(int i = s.length()-1; i>=0; i--) {
    char c = s.charAt(i);
    if(c.equals(']')) parsing = true;
    if(c.equals('[')) break;

    if(parsing) {
      int n = Integer.parseInt(String.valueOf(c));
      number += n * Math.pow(10, String.valueOf(number).length());
    }
  }
  if(!parsing) throw new NumberFormatException("Not found!");
  return number;
}
Хотя, может проще сплитнуть [, получить последний элемент, дальше сплитнуть ] и получить первый элемент.
 
Последнее редактирование:
Если у тебя цифра будет в конце в скобках ([]), то просто как-то так
PHP:
public int getInt(String s) throws NumberFormatException {
  int number = 0;
  boolean parsing = false;
 
  //Никогда раньше не писал таких итераторов, может пропускать один символ, там уже сам поправишь
  for(int i = s.length()-1; i>=0; i--) {
    char c = s.charAt(i);
    if(char.equals(']')) parsing = true;
    if(char.equals('[')) break;

    if(parsing) {
      int n = Integer.parseInt(String.valueOf(c));
      number += n * Math.pow(10, String.valueOf(number).length());
    }
  }
  if(!parsing) throw new NumberFormatException("Not found!");
  return number;
}
Хотя, может проще сплитнуть [, получить последний элемент, дальше сплитнуть ] и получить первый элемент.
if(char.equals(']')) parsing = true;
if(char.equals('[')) break;
тут char - error
 
Хотя, может проще сплитнуть [, получить последний элемент, дальше сплитнуть ] и получить первый элемент.
И обосраться, если в скобках пусто, или не int. Как и варик с реплейсом обосрался на пустоте.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх