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

Lisenochek

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

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

Код предоставлю, если понадобится.
 
Ты не объяснил практически ничего, зато написал:

А ты хорош однако...
Хорошо. Дубль 2.

Сделал я ивент, в котором идут проверки на поставленный блок (факел) с названием, затем проверка на этот же поставленный блок в мире. Над ним спавнятся частицы. Если в другом условии пройдет рандом - вызов ящика, удаление блока. В общем держите код (не кидайтесь тапками, ведь костыль жи):
JavaScript:
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);
            }
        }
    }
}
 
Что конкретно теме нужно? Записать координаты поставленного блока в мапу и потом шедулером проверять, загружен ли чанк по тем коордам и наличие того блока?
 
Что конкретно теме нужно? Записать координаты поставленного блока в хешмап и потом шедулером проверять, загружен ли чанк по тем коордам и наличие того блока?
Это конечно звучит отлично, но я сейчас как раз занят оптимизацией и вот спрашиваю, как будет грузить сервер твоя идея?

(Я знаю, что можно было вместо шедулера в моем коде юзать Thread, но Async)
 
Это конечно звучит отлично, но я сейчас как раз занят оптимизацией и вот спрашиваю, как будет грузить сервер твоя идея?

(Я знаю, что можно было вместо шедулера в моем коде юзать Thread, но Async)
В твоем коде я увидел какой то бред с запуском таймеров на каждую установку блока.
А чем моя идея будет грузить? 1 шедулер в своем трейде проходит по массиву раз в N минут или секунд.
А вот одновременное выполнение огромного числа трейдов может отожрать ядра.
 
В твоем коде я увидел какой то бред с запуском таймеров на каждую установку блока.
Например?
А насчет твоей идеи можно и попробовать, но лучше посмотрю еще другие варианты.
 
Например?
А насчет твоей идеи можно и попробовать, но лучше посмотрю еще другие варианты.
И зачем каждый раз объект класса получать? API.getInstance()? Можно же 1 раз его передать в конструктор.
 
И зачем каждый раз объект класса получать? API.getInstance()? Можно же 1 раз его передать в конструктор.
Я человек простой. Делаю все через 5 точку. Исправлю ;)
Поднял вопрос назад!

Короче. Вот вся суть проблемы. Ивент отслеживает именно блок, который поставил я последним, а на другие не обращает внимание
Неужели нет решения моей проблемы?
Идейка alexandrage не помогла.
 
Я человек простой. Делаю все через 5 точку. Исправлю ;)
Поднял вопрос назад!

Короче. Вот вся суть проблемы. Ивент отслеживает именно блок, который поставил я последним, а на другие не обращает внимание
Неужели нет решения моей проблемы?
Идейка alexandrage не помогла.
Я своей идеи тут не увидел.
Вот собстно небольшой набросок моей идеи https://cloud.mail.ru/public/LPqQ/z5RrVmNvB
 
Назад
Верх