Таймер выполнения действия

Версия Minecraft
1.7.10
23
2
Дело такое. Делаю некий куб в котором хочу поддерживать нное кол-во ентити.
Первое что меня смущает это то что Массив из этой коробки всегдя пустой, а второе то что мобы спавнятся пустышками. У него есть модель и рендеринг, но нет никакого взаимодействия с миром, тоесть он не двигается, он прозрачен, его не возможно ударить, но его видно.
Помогите пожайлуста. Вот код:
Java:
    public static void checkEntity(){
        System.out.println("Start checking");
        if(WomPlayOresMod.MainWorld == null ){return;}
        List EntityList = WomPlayOresMod.MainWorld.getEntitiesWithinAABB(ZombieNItdroid.class, AxisAlignedBB.getBoundingBox(243, 50, 253, 229, 100, 263));

        for (Object test : EntityList){
            ZombieNItdroid check = (ZombieNItdroid) test;
            System.out.println(check.toString());

        }
       
        System.out.println("Oh my god. we need one NITDroid");
        int randomX = getRandomNumberInRange(229, 243);
        int randomZ = getRandomNumberInRange(253, 263);
        int y;
       
        for (y = 63; !(WomPlayOresMod.MainWorld.getBlock(randomX, y + 1, randomZ) instanceof BlockAir); ++y)
        {
            ;
        }
       
        System.out.println("Find nice location to spawn on coords: " + randomX + ":"+ y +":"+randomZ);
        ZombieNItdroid zombieNItdroid = new ZombieNItdroid(WomPlayOresMod.MainWorld);
        zombieNItdroid.setLocationAndAngles(randomX, y+1, randomZ, 0.0F, 0.0F);
        WomPlayOresMod.MainWorld.spawnEntityInWorld(zombieNItdroid);
        zombieNItdroid.spawnExplosionParticle();

    }

Так-же сразу скажу. Если спавнить этого моба через яйцо, то все ок. Он бегает прыгает и даже убивает монстров))

И еще, эта задача запускается по таймеру.
 
23
2
Это кароч переменная которая изначально равна null, но при ивенте загрузки мира она получает значение этого мира. Вот реализация.
Java:
public static World MainWorld = null;

Java:
    @SubscribeEvent
    public void onLoad(WorldEvent.Load event)
    {
        if(event.world == null) return;
        WomPlayOresMod.MainWorld = event.world;
    }
 
23
2
Как можно взять мир если это происходит по таймеру? Я просто представить даже не могу. Как можно мир взять в методе у которого нет входных данных и он выполняется по таймеру при старте клиента-сервера
 
23
2
Что-то мне кажется что щас каждый тик будет запускаться эта задача и начнется утечка... Сделать по счетчику лучше?

Java:
public class ServerEvents {
    @SubscribeEvent
    public void onWorldTick(TickEvent.WorldTickEvent event)
    {
        World world = event.world;
        (new Timer(30000, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Regeneration.GetBlocksToRegen();

            }
        })).start();

        (new Timer(10000, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                EntityGenerator.checkEntity();

            }
        })).start();
    }
}
 
23
2
Java:
public class ServerEvents {
    public static int regenOreTime = 30 * 20;
    public static int regenOreTimer = 0;
    public static int regenEntity = 10 * 20;
    public static int regenEntityr = 0;
    @SubscribeEvent
    public void onWorldTick(TickEvent.WorldTickEvent event) {
        World world = event.world;
        if(regenOreTimer < regenOreTime){
            regenOreTimer++;
        }else{
            Regeneration.GetBlocksToRegen(world);
            regenOreTimer = 0;
        }       
        if(regenEntityr < regenEntity){
            regenEntityr++;
        }else{
            EntityGenerator.checkEntity(world);
            regenEntityr = 0;
        }
    }
}
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Необязательно заводить свои переменные таймера, тем более глобальные.
Можно сделать проверку: world.getTotalWorldTime() % 1200 == 0, действие будет выполняться раз в минуту(1 минута = 1200 тиков).
 
Сверху