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

Версия Minecraft
1.12.2
5,149
49
899
Здравствуйте. Проблема чисто вопроса кода. Значит имеется некая переменная 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 Щас бы моды писать уже второй год и не знать базовые коллекции...
Тут небольшая проблемка, либо я довен?
Я кладу только одно значение при добавлении блока в мир, затем значит тикаю его, а потом удаляю... но оно почему то сетается заново: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);
                }
            }

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

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

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} вообще?

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


Нет не сойдет она вообще коряво работает, вырастает только два блок из тех которые сетаю.
 
Последнее редактирование:
time.remove(time2, time2.time);
Дядя, у тебя ключ - это BlockPos, а ты ему вместо ключа(первый аргумент) суешь свое время.
Удалять нужно так: time.remove(pos).
P.S Нахрена городить этот бред, если есть рандомные тики в мире которые отлично подходят для роста листвы?
 
рандомные тики в мире которые отлично подходят для роста листвы?
Да пусть даже так. Блин... Все равно для деревьев то оно надо. Хм, а вот тут придется подумать над сохранением. А ***** оно все конем, пусть по рандому растут, тупо размеры ограничу.

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