Парсить BlockPos в инт или что то такое

Версия Minecraft
1.12.2
5,018
47
783
Здравствуйте. Проблема чисто вопроса кода. Значит имеется некая переменная int, которая привязывается к координатам в мире или если точнее, к позиции. Неважно.
Так вот, эта переменная сохраняется такая в массив, обычный такой List значит. Для каждой позиции соответственно создается новое теплое местечко в массиве и присваивается индекс. Когда число , хранящееся в этом индексе, скажем, выполняет свою задачу, его надобно удалить, чтобы не занимало место. Более того оно не только место занимает, но и продолжает тикать, что естественно не есть хорошо. Так вот надо бы ее удалить из массива, и сделать это можно лишь способом remove(index). То есть мне необходимо знать индекс, под которым сохраняется блок в этот лист.
Казалось бы, создай счетчик и пусть он считает каким по счету блок был добавлен в мир. Но ведь он обнулится после перезахода, а его сохранять это лишнее ненужное костыльное телодвижение...
В общем нужно каким то образом получить индекс, под которым pos сохранился в лист. К слову это блок листвы, игроков много, так что количества блоков в мире будет тыщами измеряться. И каждый должен локально оттикать и удалится.

Либо же нужно парсить поз в инт. Я пробовал вот так, оно бы конечно сработало на ура, если бы pos не исчислялся числами большими чем int))

Java:
    int indexPos;
    @Override
    public void onBlockAdded(World world, BlockPos pos, IBlockState state) {
        world.scheduleBlockUpdate(pos, this, 1, 0);
        long lPos = pos.toLong();
        String sPos = Long.toString(lPos);
        System.out.println("sPos " + sPos);
        int iPos = Integer.parseInt(sPos);
        System.out.println("iPos " + iPos);
        time.add(iPos, new TimerForPos(pos,0));
        indexPos = iPos;
    }
 
Последнее редактирование:
Решение
Херня твой индекОф, не работает, -1 индекс сетает.
А, епт. У тебя лист хранит не блокпосы, а свой тип.
Тогда лучше как сказал человечек выше - мапу сделай и все.

Java:
Map<BlockPos, TimeForPos> times = Maps.newHashMap();

times.put(new BlockPos(x, y, z), new TimeForPos(...)); // Добавляем
TimeForPos time = times.get(new BlockPos(x, y, z)); // Получаем

P.S Щас бы моды писать уже второй год и не знать базовые коллекции...
5,018
47
783
Тут небольшая проблемка, либо я довен?
Я кладу только одно значение при добавлении блока в мир, затем значит тикаю его, а потом удаляю... но оно почему то сетается заново:unsure:

Java:
    Map<BlockPos, TimerForPos> time = Maps.newHashMap();

    @Override
    public void onBlockAdded(World world, BlockPos pos, IBlockState state) {
        world.scheduleBlockUpdate(pos, this, 1, 0);
        time.put(pos, new TimerForPos(pos, 0));
    }  

@Override
    public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
        TimerForPos time2 = time.get(pos);

        for (TimerForPos t : time.values()) {
            if (t != null && t.pos == pos) {
                time2 = t;
                ++t.time;
            }
        }
        if (time2 == null) return;
        world.scheduleBlockUpdate(pos, this, 1, 0);

   
        if(!world.isRemote) {
            System.out.println(time2.time);
            if(time2.time >= 80) {
                world.setBlockState(pos, BlocksList.BIG_OAK_LEAVES_BLOCK.getDefaultState());
                if(time2.pos == pos) {
                    time.remove(time2, time2.time);
                }
            }

        }
    }
 
Последнее редактирование:
5,018
47
783
Короч я понял, это лажовый remove, он удаляет только запись для ключа, но не удаляет сам ключ...
 
5,018
47
783
Вообще необязательно. Но для данного метода сие понятие применимо. Да фигня, неужели нету метода который удаляет конкретный ключ и его значение? наверняка есть

ЗюЫ нагуглил вот такую штуку, но она почему то срабатывает два раза, причем второй для значения, которое к этому вообще никак не относится...

Java:
                Iterator it = time.entrySet().iterator();
                    while (it.hasNext()) {
                        Map.Entry pair = (Map.Entry)it.next();
                        it.remove();
                    }

Java:
77
78
79
80
[18:40:35] [Server thread/INFO] [STDOUT]: [com.legendgamer.realism.blocks.SmallLeaves:updateTick:160]: BlockPos{x=-61, y=71, z=-1868} = com.legendgamer.realism.API.TimerForPos@7cd427cc
[18:40:35] [Server thread/INFO] [STDOUT]: [com.legendgamer.realism.blocks.SmallLeaves:updateTick:160]: BlockPos{x=-60, y=71, z=-1868} = com.legendgamer.realism.API.TimerForPos@254e118f
Причем тут BlockPos{x=-60, y=71, z=-1868} вообще?

Вообще конеш и так сойдет, но хотелось бы эту штуку поправить.


Нет не сойдет она вообще коряво работает, вырастает только два блок из тех которые сетаю.
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,454
598
2,890
time.remove(time2, time2.time);
Дядя, у тебя ключ - это BlockPos, а ты ему вместо ключа(первый аргумент) суешь свое время.
Удалять нужно так: time.remove(pos).
P.S Нахрена городить этот бред, если есть рандомные тики в мире которые отлично подходят для роста листвы?
 
5,018
47
783
рандомные тики в мире которые отлично подходят для роста листвы?
Да пусть даже так. Блин... Все равно для деревьев то оно надо. Хм, а вот тут придется подумать над сохранением. А ***** оно все конем, пусть по рандому растут, тупо размеры ограничу.

Но зато я теперь умею юзать мапу:D
 
5,018
47
783
наконец-то джаву выучишь так.
А что мне еще осталось? Вроде теперь уже все знаю:)
А не, лямбды не знаю и анонимные классы. Хотя не, я знаю что эт, но хз зачем они нужны
 
5,018
47
783
Сверху