Рандомные числа

Мне нужно сделать телепортацию игрока на случайные координаты вокруг него на 30 блоков максимум. То есть, он может телепортироваться в случайную точку в радиусе 30 блоков. Для этого нужен рандомчик. Но дело в том, что он работает либо лишь с отрицательными или положительными числами одновременно. А мне надо чтоб могло быть как -1, так и +1 по x, например. Каким образом можно это реализовать?
 
Ммм... Да, натолкнуло на мысль об изменениях кода, которые ни к чему не привели
[merge_posts_bbcode]Добавлено: 04.07.2016 15:30:35[/merge_posts_bbcode]

Код:
public void onArmorTickUpdate(World world, EntityPlayer player, ItemStack itemStack)
{
    double newX = player.posX + world.rand.nextInt(30) - world.rand.nextInt(30);
    double newZ = player.posZ + world.rand.nextInt(30) - world.rand.nextInt(30);

    if(Keyboard.isKeyDown(Keyboard.KEY_X))
    {
        player.setPosition(newX, player.posY, newZ);
    }
}

[merge_posts_bbcode]Добавлено: 04.07.2016 15:30:59[/merge_posts_bbcode]

Это - не работает. До этого сделал на Shift - тоже нет
 

timaxa007

Модератор
5,831
409
672
Magitrop написал(а):
Код:
    if(Keyboard.isKeyDown(Keyboard.KEY_X))
Это только клиентская сторона.

Magitrop написал(а):
Это - не работает. До этого сделал на Shift - тоже нет
Если на Keyboard, то это только опять-же клиентская сторона.
 

timaxa007

Модератор
5,831
409
672
Можно использовать player.isSneaking(), место клиентского Shift'а.
---
Либо пакетами пользоваться.
 
Заменил if[font=monospace, sans-serif]([/font][font=monospace, sans-serif]Keyboard[/font][font=monospace, sans-serif].[/font][font=monospace, sans-serif]isKeyDown[/font][font=monospace, sans-serif]([/font][font=monospace, sans-serif]Keyboard[/font][font=monospace, sans-serif].[/font][font=monospace, sans-serif]KEY_X[/font][font=monospace, sans-serif])) на [/font][font=monospace, sans-serif]if[/font][font=monospace, sans-serif]([/font][font=monospace, sans-serif]player.isSneaking()[/font][font=monospace, sans-serif])[/font]
[merge_posts_bbcode]Добавлено: 04.07.2016 15:38:41[/merge_posts_bbcode]

Нет, не работает вообще. Приседаю, хожу на шифте - нет. Есть другие способы?
 

timaxa007

Модератор
5,831
409
672
Убедись, что используешь тот метод.
[merge_posts_bbcode]Добавлено: 04.07.2016 15:09:30[/merge_posts_bbcode]

У меня работает.
 
Тот метод? Какой именно тот?
[merge_posts_bbcode]Добавлено: 04.07.2016 16:09:54[/merge_posts_bbcode]

Код:
public void onArmorTickUpdate(World world, EntityPlayer player, ItemStack itemStack)
{
    int newX = (int)player.posX + world.rand.nextInt(30) - world.rand.nextInt(30);
    int newZ = (int)player.posZ + world.rand.nextInt(30) - world.rand.nextInt(30);

    if (player.isSneaking())
    {
        player.setPosition((double)newX + 0.5D, player.posY, (double)newZ + 0.5D);
        //timer = 60;
    }
}

[merge_posts_bbcode]Добавлено: 04.07.2016 16:10:06[/merge_posts_bbcode]

Я скопировал и поменял из той ссылки

[merge_posts_bbcode]Добавлено: 04.07.2016 16:11:15[/merge_posts_bbcode]

Я так посмотрел, убрал все условия и оставил лишь player.setPosition(...). И тут обнаружилось, что это он не работает.
 

timaxa007

Модератор
5,831
409
672
Там метод для 1.6+ onArmorTickUpdate, а вот у меня на 1.7.10 метод onArmorTick:
Код:
@Override
public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
    double newX = player.posX + world.rand.nextInt(30) - world.rand.nextInt(30);
    double newZ = player.posZ + world.rand.nextInt(30) - world.rand.nextInt(30);

    if (player.isSneaking()) {
        player.setPosition(newX, player.posY, newZ);
    }
}
 
1,976
68
220
!world.isRemote Пушкин проверять будет?
[merge_posts_bbcode]Добавлено: 04.07.2016 15:46:30[/merge_posts_bbcode]

И лучше setPositionAndUpdate
 
2,505
81
397
И лучше кучу рандомов занести под условие
 
Спасибо вам всем!

Но вот он должон телепортироваться раз в 5 секунд, а телепортируется постоянно. Да, я сделал таймер.
[merge_posts_bbcode]Добавлено: 04.07.2016 17:46:22[/merge_posts_bbcode]

Код:
int timer = 60;

...

public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack)
{
    timer--;

    double newX = player.posX + world.rand.nextInt(30) - world.rand.nextInt(30);
    double newZ = player.posZ + world.rand.nextInt(30) - world.rand.nextInt(30);

    if (!world.isRemote)
    {
        if (player.isSneaking() && timer == 0)
        {
            timer = 60;
            player.setPositionAndUpdate(newX, player.posY, newZ);
        }
    }
}

[merge_posts_bbcode]Добавлено: 04.07.2016 17:46:44[/merge_posts_bbcode]

Теперь он вообще не телепортируется
 
2,505
81
397
Код:
if (!world.isRemote && world.getTotalWorldTime() % 100 == 0) {
    
}

Если по-простому
 
2,505
81
397
получитьОбщееМировоеВремя()
Из названия метода же все понятно
 
Dahaka написал(а):
получитьОбщееМировоеВремя()
Из названия метода же все понятно

Код:
if (!world.isRemote && world.getTotalWorldTime() % 100 == 0) {
    
}


Тогда что будет делать это?
Если общее мировое время делится нацело на 100 то происходит действие? Или я чего-то не понял?
[merge_posts_bbcode]Добавлено: 05.07.2016 13:18:28[/merge_posts_bbcode]

Кстати, да, это работает, но не совсем так, как хотелось бы. Каждые пять секунд можно телепортироваться, если присесть, все верно, да вот только мне надо сделать именно кулдаун этой способности. Потому что сейчас, через getTotalWorldTime() он отсчитывает время всего мира, то есть я смогу телепортироваться каждые пять секунд в мире, а не каждые пять секунд после предыдущей телепортации. Это не совсем правильно, поскольку очень часто приходится сидеть на шифте еще секунды 2-3, а должно быть мгновенно.

Хотя... работает ведь. Но таймер желательнее. Кто подскажет?
 
2,505
81
397
Кулдаун можно сделать как минимум двумя способами. Привязать его к стаку (по-проще) или к игроку (по-сложнее)
1. Создать в стаке nbt тэг в качестве секундомера и в onUpdate уменьшать его. 
2. Создать для игрока IExtendedEntityProperties с подобным значением и уменьшать его в ивенте TickEvent.PlayerTickEvent.
 
Сверху