Помогите Срабатывание таймера только для одного игрока

Статус
Закрыто для дальнейших ответов.

Lisenochek

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

Можете мне помочь?
 
Всем привет. Сделал таймер, который спавнит сундуки при срабатывании ивента, но беда в том, что сундуки таймер спавнит всем игрокам (логично, правда?), а мне надо, чтобы таймер сработал только у того игрока, который и активировал ивент.

Можете мне помочь?
Эм... Щто? Несешь какую-то дичь..
Может хотя-бы код скинешь??
 
Проблема такая, что таймер срабатывает у всех, а мне надо, чтобы таймер срабатывал только у игрока, который совершил действие.


Да, конечно. Вот:

JavaScript:
    @EventHandler
    public void dropCommon(BlockPlaceEvent e) {

        Player p = e.getPlayer();
        Block b = e.getBlockPlaced();

        if (!this.ml.WLWorlds.contains(e.getPlayer().getWorld().getName())) {
            return;
        }

        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, cm.messageConfig.getString("signal_enable"));

                BukkitRunnable run = new BukkitRunnable() {

                    @Override
                    public void run() {

                        for (Player p : Bukkit.getOnlinePlayers()) {

                            World w = Bukkit.getWorld("Realistic_World");

                            Location loc = p.getLocation();
                            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) {

                                            ParticleEffect.SMOKE_LARGE.display(0, 2, 0, 0, 5,
                                                    b.getLocation().add(0.5, 0, 0.5), 200);

                                            if (r.nextInt(500) <= 10) {

                                                cs.spawnCrate();

                                                b.setType(Material.AIR);

                                                this.cancel();

                                                MessageManager.getManager().msg(p, MsgType.SUCCESS,
                                                        cm.messageConfig.getString("signal_success"));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                };
                run.runTaskTimer(plugin, 1, 1);
            }
        }
    }
 
Так не запускай цикл,которой проходит по всем игрокам.
 
Я не могу понять... Ты код писал сам?..
Ты сам делаешь цикл чтоб сделать что-то для всех игроков, а не для того который содержится в ивенте...
Так что, давай ты сам раскроешь глазки...
 
Я не могу понять... Ты код писал сам?..
Ты сам делаешь цикл чтоб сделать что-то для всех игроков, а не для того который содержится в ивенте...
Так что, давай ты сам раскроешь глазки...
Он скорее хочет чтобы только один игрок видел результат, ну хз хз
 
Я не хочу вьезжать в код, но имхо, проблема в этом:
upload_2016-8-23_22-53-36.png
 
Проблема все еще актуальна.

Еще раз повторю суть проблемы: если игрок поставит кастомный факел заспавнится сундук всем игрокам поблизости, хотя они не ставили факела (логика таймера).

А надо, чтобы сундук спавнился ТОЛЬКО тому человеку, кто и поставил факел.

Обновленный код таймера:
JavaScript:
package com.realistic.events;

import java.util.Random;

import org.bukkit.Bukkit;
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.particle_api.ParticleEffect;
import com.realistic.timers.Crate_spawn;

public class Signal_Drop implements Listener {

    private API plugin;
    private configMessage cm;
    private MinecraftList ml;
    private Crate_spawn cs;
    private final Random r = new Random();

    public Signal_Drop(API plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void dropCommon(BlockPlaceEvent e) {

        Player p = e.getPlayer();
        Block b = e.getBlockPlaced();

        if (!this.ml.WLWorlds.contains(e.getPlayer().getWorld().getName())) {
            return;
        }   

        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, cm.messageConfig.getString("signal_enable"));

                BukkitRunnable run = new BukkitRunnable() {

                    @Override
                    public void run() {

                        World w = Bukkit.getWorld("Realistic_World");

                        Location loc = p.getLocation();
                        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) {

                                        ParticleEffect.SMOKE_LARGE.display(0, 2, 0, 0, 5,
                                                b.getLocation().add(0.5, 0, 0.5), 200);

                                        if (r.nextInt(500) <= 10) {

                                            cs.spawnCrate();

                                            b.setType(Material.AIR);

                                            this.cancel();

                                            MessageManager.getManager().msg(p, MsgType.SUCCESS,
                                                    cm.messageConfig.getString("signal_success"));
                                        }
                                    }
                                }
                            }
                        }
                    }
                };
                run.runTaskTimer(plugin, 5, 5);
            }
        }
    }
}
 
Ну скорее всего там и спавнит всем игрокам сундук.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх