Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап Помощь в изучении языка Java

Автор, подскажи на счет импорта. К примеру я не хочу в mainClass пистаь много кода, можно написать по разным классам, а потом импортировать и как?
Если классы лежат в одном пакете, импортировать не нужно - javac сам понимает и подхватывает их во время компиляции.
Если же классы в разных пакетах или проектах - нужно определить импорт.
Обычно хорошие IDE импортируют всё автоматически.
UPD: подробности есть в любой литературе об основах языка Java
 
А как делают работу с табличками? Мне надо чтобы на первой строке писали [Nova-Craft] на второй цену, и на третьей стутус, как сделать снятие денег и при клике на табличку?
 
А как делают работу с табличками? Мне надо чтобы на первой строке писали [Nova-Craft] на второй цену, и на третьей стутус, как сделать снятие денег и при клике на табличку?
Ну тогда просто эвент регистрируй, в главном классе
 
Чтоб не создавать отдельную тему, подскажите, как в событии onBlockPlace проверить, что блок ставится в обычном мире?
 
Чтоб не создавать отдельную тему, подскажите, как в событии onBlockPlace проверить, что блок ставится в обычном мире?
event.getBlock().getWorld().equals(Bukkit.getWorlds().get(0))
UPD: возиожно я не правильно понял, имелось в виду
world.getEnvironment()
 
event.getBlock().getWorld().equals(Bukkit.getWorlds().get(0))
спасибо, вроде оно.
На сервере есть область, где можно ломать, но ставить блоки нельзя
Java:
@EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
        if (event.isCancelled() || event.getPlayer() == null || event.getPlayer().isOp()) {
            return;
        }
      
        Block b = event.getBlock();
        if (!b.getWorld().equals(Bukkit.getWorlds().get(0))) {
            return;
        }
      
        int bX = b.getX();
        int bY = b.getY();
        int bZ = b.getZ();
      
        if (bY>64 && bY<100 && bX>0 && bX<100 && bZ>0 && bZ<100) {
            event.setCancelled(true);
            event.getPlayer().kickPlayer("Ставить блоки запрещено.");
        }
    }
правильно ли я делаю? Правильно ли вызывать метод kickPlayer из onBlockPlace?

Другой вопрос, эта область выделена в регион WorldGuard, может использовать API WorldGuard и сравнивать имя региона, чем делать проверку по координатам области и т.д.? Что в этом случае будет с производительностью сервера?
 
спасибо, вроде оно.
На сервере есть область, где можно ломать, но ставить блоки нельзя
Java:
@EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
        if (event.isCancelled() || event.getPlayer() == null || event.getPlayer().isOp()) {
            return;
        }
     
        Block b = event.getBlock();
        if (!b.getWorld().equals(Bukkit.getWorlds().get(0))) {
            return;
        }
     
        int bX = b.getX();
        int bY = b.getY();
        int bZ = b.getZ();
     
        if (bY>64 && bY<100 && bX>0 && bX<100 && bZ>0 && bZ<100) {
            event.setCancelled(true);
            event.getPlayer().kickPlayer("Ставить блоки запрещено.");
        }
    }
правильно ли я делаю? Правильно ли вызывать метод kickPlayer из onBlockPlace?

Другой вопрос, эта область выделена в регион WorldGuard, может использовать API WorldGuard и сравнивать имя региона, чем делать проверку по координатам области и т.д.? Что в этом случае будет с производительностью сервера?
1) Не структурированно, но правильно
2) kickPlayer вызывать можно, т.к. событие синхронное.
Но не грубо ли? Можно просто
Java:
event.setCancelled(true); // не сможет поставить, т.к. событие отменено
player.sendMessage("блабла, ставить блоки запрещено")
3) Можете смело использовать WorldGuard: http://wiki.sk89q.com/wiki/WorldGuard/Regions/API
При таком режиме на производительность это почти не повлияет.
 
Для экономии места задам нубский вопрос здесь.
Как получить блок слева и справа перед игроком. Все на уровне глаз.
поясню "о" - блок. "O" -блок который нужно получить Й - игрок.
00000000000000000000000000
00000000ОоОоооооооооооооооо
ооооооооооЙооооооооооооооооо
 
Для экономии места задам нубский вопрос здесь.
Как получить блок слева и справа перед игроком. Все на уровне глаз.
поясню "о" - блок. "O" -блок который нужно получить Й - игрок.
00000000000000000000000000
00000000ОоОоооооооооооооооо
ооооооооооЙооооооооооооооооо
Сначала берем
eye = player.getEyeLocation() - это позиция глаз игрока.
Теперь dir = eye.getDirection() - это направление, куда смотрит игрок.
targetBlock = eye.add(dir).getBlock() - мы получили блок на расстоянии 1 от глаз.

Вариант 1: если нужно ориентироваться по сторонам света
По значению dir.getYaw() узнаем, в какую из четырех сторон смотрит игрок. Точнее, нужно проработать всего 2 варианта. (север-юг) и (запад-восток)
Пример есть тут:
http://forums.bukkit.org/threads/direction-the-playser-faces-north-south.20773/
Дальше - в зависимоси от направления:
block1 = targetBlock.getRelative(NORTH); block2 = targetBlock.getRelative(SOUTH)
или
block1 = targetBlock.getRelative(EAST); block2 = targetBlock.getRelative(WEST)

Вариант 2: если нужно учитывать все направления.
Делайте вращение вектора на угол 90 , затем берите следующий блок от targetBlock на расстоянии 1 (векторы можно нормализовывать методом normalize ), затем разворот вектора (можно уможить на -1), и снова берем следующий блок от targetBlock. Тогда Блоки будут браться даже по диагонали, причем с учетом высоты взгляда. ниже - пример.
.X... X - блок-цель
..A.. A - блок, на который смотрит игрок
.P.X. P - позиция игрока

Как делать вращение вектора - смотрите в учебнике по линейной алгебре. У Bukkit API нет своих методов для вращения. Подозреваю, что здесь требуется векторное произведение вектора на какую-то константу. А это - есть.
Пардон, придумал способ проще.
Сейчас распишу.
UPD: код на груви, возвращает массив из двух блоков. me - это игрок.
Перепишите на java (это вроде не сложно)
Код:
import static org.bukkit.block.BlockFace.*

def eye = me.eyeLocation
def myFace = getFace(eye.yaw)
blocks = []
for (def face: getTargetFaces(myFace)) {
    blocks.add(eye.block.getRelative(face))
}
return blocks

def getFace (yaw) {
    if (315<yaw || yaw<45) SOUTH
    else if (yaw<135) WEST
    else if (yaw<225) NORTH;
    else EAST;
}

def getTargetFaces (face) {
    switch (face) {
        case NORTH: return [NORTH_WEST,NORTH_EAST]
        case EAST: return [NORTH_EAST,SOUTH_EAST]
        case WEST: return [NORTH_WEST,SOUTH_WEST]
        case SOUTH: return [SOUTH_EAST,SOUTH_WEST]
    }
}
 
Последнее редактирование:
Дополните ссылками на онлайн версии или альтернативные онлайн обучения
Админ что за хрень? Я вам уже месяц пишу по поводу покупки рекламы а вы не отвечаете???
 
Последнее редактирование модератором:
Требую добавления сюда в список JavaRush! http://javarush.ru - самый лучший сайт, легко и понятно дается материал, в виде игры, и мультов "Футурамы"
 
Требую добавления сюда в список JavaRush! http://javarush.ru - самый лучший сайт, легко и понятно дается материал, в виде игры, и мультов "Футурамы"
Когда я туда зашел, у меня сразу же пропало желание что-либо изучать...
 

Поделиться этой страницей

Назад
Верх