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

Мне нужно сделать телепортацию игрока на случайные координаты вокруг него на 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 - тоже нет
 
Magitrop написал(а):
Код:
    if(Keyboard.isKeyDown(Keyboard.KEY_X))
Это только клиентская сторона.

Magitrop написал(а):
Это - не работает. До этого сделал на Shift - тоже нет
Если на Keyboard, то это только опять-же клиентская сторона.
 
Можно использовать 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]

Нет, не работает вообще. Приседаю, хожу на шифте - нет. Есть другие способы?
 
Убедись, что используешь тот метод.
[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(...). И тут обнаружилось, что это он не работает.
 
Там метод для 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);
    }
}
 
!world.isRemote Пушкин проверять будет?
[merge_posts_bbcode]Добавлено: 04.07.2016 15:46:30[/merge_posts_bbcode]

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

Но вот он должон телепортироваться раз в 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]

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

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

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


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

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

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