Списки, массивы, циклы

Версия Minecraft
1.12.2
192
2
9
Всем привет. Давно меня тут не было)

Есть код, в котором нужно менять значение XXX на постоянно возрастающее по порядку, но как лучше и правильнее это реализовать?
К примеру, мне надо, чтобы вместо XXX в первый раз было 1, во второй 0, в третий 2 и т.п., то есть числа разные, но должны выставляться строго в порядке очереди. При достижении последнего значения необходимо, чтобы именно оно повторялось уже постоянно.

Естественно, желательно пример или был бы вообще рад любым ресурсам, где можно подробно всё необходимое изучить.

Java:
    public void onLanded(World worldIn, Entity entityIn)
    {
        if (entityIn.isSneaking())
        {
            super.onLanded(worldIn, entityIn);
        }
        else if (entityIn.motionY < 0.0D)
        {
            entityIn.motionY = 0;

            if (!(entityIn instanceof EntityLivingBase))
            {
                entityIn.motionY = XXX;
            }
        }
    }
 
Решение
Тебе нужно хранить где-то значение счетчика. Можно в атрибуте, можно в капе. Либо же просто сделать мапу <ник_игрока, счетчик>.
В методе счетчик увеличивать на один и по счетчику(он же индексом будет) доставать из другого списка свои значения. Проверять, если счетчик больше или равен 10 - приравнивать к 10.
Java:
Map<String, Integer> counters = new HashMap<>();
List<Integer> values = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7);

onLanded(...){
    if(!counters.containsKey(entity.getName()){
        counters.put(entity.getName(), 1);
    }

    int i = counters.get(entity.getName());
    entity.motionY = values.get(i);
    counters.put(entity.getName(), Math.min(i + 1, 10));
}
}
Тебе нужно хранить где-то значение счетчика. Можно в атрибуте, можно в капе. Либо же просто сделать мапу <ник_игрока, счетчик>.
В методе счетчик увеличивать на один и по счетчику(он же индексом будет) доставать из другого списка свои значения. Проверять, если счетчик больше или равен 10 - приравнивать к 10.
Java:
Map<String, Integer> counters = new HashMap<>();
List<Integer> values = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7);

onLanded(...){
    if(!counters.containsKey(entity.getName()){
        counters.put(entity.getName(), 1);
    }

    int i = counters.get(entity.getName());
    entity.motionY = values.get(i);
    counters.put(entity.getName(), Math.min(i + 1, 10));
}
}
 
В действии всё хорошо и вроде бы как нужно, но до определенного момента)
Когда значение достигается максимального, оно не повторяется постоянно, а клиент просто крашит.
Плюс я заметил, что числа используются не по порядку а через 3-4 сразу. К примеру: сначала 1, потом 4, потом 7, потом 10.

Получившийся код:
Java:
    Map<String, Integer> counters = new HashMap<>();
    List<Integer> values = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
   
    public void onEntityWalk(World worldIn, BlockPos pos, Entity entityIn)
    {

        {
            Entity entity = entityIn;
            if(!counters.containsKey(entity .getName())){
                counters.put(entity.getName(), 1);
            }

            int i = counters.get(entity.getName());
            entity.motionY = values.get(i);
            counters.put(entity.getName(), Math.min(i + 1, 10));
        }

        super.onEntityWalk(worldIn, pos, entityIn);
    }

Краш:
Java:
java.lang.IndexOutOfBoundsException: Index: 10, Size: 10
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at ru.idinya.jumpplates.block.Block09.onEntityWalk(Block09.java:93)
    at net.minecraft.entity.Entity.move(Entity.java:1034)
    at net.minecraft.client.entity.EntityPlayerSP.move(EntityPlayerSP.java:1189)
    at net.minecraft.entity.EntityLivingBase.travel(EntityLivingBase.java:2163)
    at net.minecraft.entity.player.EntityPlayer.travel(EntityPlayer.java:1976)
    at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:2614)
    at net.minecraft.entity.player.EntityPlayer.onLivingUpdate(EntityPlayer.java:577)
    at net.minecraft.client.entity.EntityPlayerSP.onLivingUpdate(EntityPlayerSP.java:1136)
    at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:2396)
    at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:272)
    at net.minecraft.client.entity.EntityPlayerSP.onUpdate(EntityPlayerSP.java:230)
    at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2168)
    at net.minecraft.world.World.updateEntity(World.java:2127)
    at net.minecraft.world.World.updateEntities(World.java:1928)
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1972)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1186)
    at net.minecraft.client.Minecraft.run(Minecraft.java:441)
    at net.minecraft.client.main.Main.main(Main.java:118)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
    at GradleStart.main(GradleStart.java:25)
 
Замена значения Math.min(i + 1, 10) на 1 меньше максимального значения в списке помогло.
И в целом вопрос можно считать решенным, но) Можно ли как-то обнулять счетчик, если игрок уже не на данном блоке?
Можно ли это сделать прямо в классе блока или это уже эвенты?
 
Назад
Сверху