Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Проблема с BlockBreakEvent

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lisenochek, 12 сен 2016.

  1. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Всем привет. Сделал сигнальные шашки, но столкнулся с проблемой, суть такова:

    Если поставить несколько шашек то сундуки будут появляться только около последнего поставленной шашки, но мне надо сделать так, чтобы сундук спавнился только около своей шашки. Есть варианты решение моей проблемы?

    Код предоставлю, если понадобится.
     
  2. Хостинг MineCraft
    <
  3. Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Ты не объяснил практически ничего, зато написал:
    А ты хорош однако...
     
  4. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Хорошо. Дубль 2.

    Сделал я ивент, в котором идут проверки на поставленный блок (факел) с названием, затем проверка на этот же поставленный блок в мире. Над ним спавнятся частицы. Если в другом условии пройдет рандом - вызов ящика, удаление блока. В общем держите код (не кидайтесь тапками, ведь костыль жи):
    Код:
    package com.realistic.signal;
    
    import java.util.Random;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.World;
    import org.bukkit.block.Block;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.BlockPlaceEvent;
    import org.bukkit.scheduler.BukkitRunnable;
    
    import com.realistic.api.API;
    import com.realistic.api.MessageManager;
    import com.realistic.api.MessageManager.MsgType;
    import com.realistic.config.configMessage;
    import com.realistic.list.MinecraftList;
    import com.realistic.otherAPI.ParticleEffect;
    import com.realistic.timers.Crate_spawn;
    
    public class Handler_commonSignal implements Listener {
    
        private final Random r = new Random();
        public static Location commonSignalLocation;
        public static Block commonSignalBlock;
    
        @SuppressWarnings("deprecation")
        @EventHandler
        public void dropCommon(BlockPlaceEvent e) {
    
            Player p = e.getPlayer();
            Block b = e.getBlockPlaced();
            World w = p.getWorld();
            Location loc = p.getLocation();
            commonSignalLocation = e.getBlock().getLocation();
            commonSignalBlock = b;
    
            ProtectSignals.ProtectCommon();
    
            if (e.isCancelled()) {
                return;
            }
    
            if (e.getBlockPlaced().getTypeId() == 76) {
    
                if (p.getItemInHand().getItemMeta().getDisplayName() != null
                        && p.getItemInHand().getItemMeta().getDisplayName()
                                .equalsIgnoreCase(ChatColor.GOLD + ChatColor.BOLD.toString() + "Сигнальная шашка")) {
    
                    MessageManager.getManager().msg(p, MsgType.SUCCESS,
                            configMessage.messageConfig.getString("signal_enable"));
    
                    MinecraftList.commonSignal.add(p);
    
                    BukkitRunnable run = new BukkitRunnable() {
    
                        @Override
                        public void run() {
    
                            if (MinecraftList.commonSignal.contains(p)) {
                                int radius = 25;
                                for (int x = -radius; x < radius; x++) {
                                    for (int y = -radius; y < radius; y++) {
                                        for (int z = -radius; z < radius; z++) {
                                            Block b = w.getBlockAt(loc.getBlockX() + x, loc.getBlockY() + y,
                                                    loc.getBlockZ() + z);
    
                                            if (b.getType() == Material.REDSTONE_TORCH_ON) {
    
                                                if (b.getType() == Material.AIR) {
    
                                                    MinecraftList.commonSignal.remove(p);
                                                }
    
                                                if (r.nextInt(5000) <= 50) {
    
                                                    b.setType(Material.AIR);
    
                                                    Crate_spawn.commonCrate();
    
                                                    MessageManager.getManager().msg(p, MsgType.SUCCESS,
                                                            configMessage.messageConfig.getString("signal_success"));
                                                }
    
                                                ParticleEffect.SMOKE_LARGE.display(0, 2, 0, 0, 5,
                                                        b.getLocation().add(0.5, 3, 0.5), 200);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    };
                    run.runTaskTimer(API.getInstance(), 2, 2);
                }
            }
        }
    }
    
     
  5. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Что конкретно теме нужно? Записать координаты поставленного блока в мапу и потом шедулером проверять, загружен ли чанк по тем коордам и наличие того блока?
     
  6. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Это конечно звучит отлично, но я сейчас как раз занят оптимизацией и вот спрашиваю, как будет грузить сервер твоя идея?

    (Я знаю, что можно было вместо шедулера в моем коде юзать Thread, но Async)
     
  7. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    В твоем коде я увидел какой то бред с запуском таймеров на каждую установку блока.[DOUBLEPOST=1473696964,1473696844][/DOUBLEPOST]А чем моя идея будет грузить? 1 шедулер в своем трейде проходит по массиву раз в N минут или секунд.[DOUBLEPOST=1473697386][/DOUBLEPOST]А вот одновременное выполнение огромного числа трейдов может отожрать ядра.
     
  8. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Например?
    А насчет твоей идеи можно и попробовать, но лучше посмотрю еще другие варианты.
     
  9. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    И зачем каждый раз объект класса получать? API.getInstance()? Можно же 1 раз его передать в конструктор.
     
  10. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Я человек простой. Делаю все через 5 точку. Исправлю ;)[DOUBLEPOST=1473874122,1473699145][/DOUBLEPOST]Поднял вопрос назад!

    Короче. Вот вся суть проблемы. Ивент отслеживает именно блок, который поставил я последним, а на другие не обращает внимание[DOUBLEPOST=1473942531][/DOUBLEPOST]Неужели нет решения моей проблемы?
    Идейка alexandrage не помогла.
     
  11. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Я своей идеи тут не увидел.[DOUBLEPOST=1473944093][/DOUBLEPOST]Вот собстно небольшой набросок моей идеи https://cloud.mail.ru/public/LPqQ/z5RrVmNvB
     

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