Войти или зарегистрироваться

Помогите Как программно разрешить бить NPC-ботов в регионе без PvP

AlexeiGL

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
MrAlexei
Вообщем есть у меня плагин (http://rubukkit.org/threads/plagin-na-novye-rpg-predmety.117045/) который мне написали за 800 рублей, мне нужно чтобы появилась возможность бить NPC-ботов (Из плагина Citizens в Sentry) в регионе без PvP. Такая возможность есть в плагине RPGItems, но я не пойму как это сделать...
Пробовал:
JavaScript:
  if (!canPvP(e.getEntity().getLocation()) && Sentry.getSentry(e.getEntity()) == null) return;
Но не помогло...
 
Ну вот и попроси человека, который делал тебе плагин, переписать. А так, для того, чтобы узнать, как это сделать, нужно хотя бы видеть код плагина и вносить в него изменения) Тут же не экстрасенсы сидят, которые сходу могут точно сказать: "Измени в строчке n класса A b на c".
 
JavaScript:
package net.clouder7.magicitems;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.*;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;

import com.sk89q.worldguard.protection.flags.DefaultFlag;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Listeners implements Listener {

    List<Player> shooters = new ArrayList<Player>();
    HashMap<Player, WitherSkull> pws = new HashMap<>();
    HashMap<Fireball, Player> pf = new HashMap<>();
    HashMap<Player, Vector> pv = new HashMap<>();

    @EventHandler
    public void PlayerInteract(PlayerInteractEvent e) {
        if (!e.getAction().equals(Action.RIGHT_CLICK_AIR)) return;
        for (String keys : Main.getConfiguration().getConfigurationSection("magicItems").getKeys(false)) {
            if (MagicItemManager.equals(keys, e.getItem())) {
                if (MagicItemManager.countdowns.contains(MagicItemManager.getCountdown(e.getPlayer()))) {
                    e.getPlayer().sendMessage(ChatColor.YELLOW + "Ты уже недавно использовал такой предмет!");
                    return;
                }
                MagicItemManager.countdowns.add(new MagicItemManager.Countdown(e.getPlayer(),
                        MagicItemManager.getMagicItem(keys).getDelay()));
                Location loc = e.getPlayer().getEyeLocation().toVector().add(e.getPlayer().getLocation()
                        .getDirection().multiply(2)).toLocation(e.getPlayer().getWorld(),
                        e.getPlayer().getLocation().getYaw(), e.getPlayer().getLocation().getPitch());
                switch (MagicItemManager.getMagicItem(keys).getEffect()) {
                    case LIGHTNING:
                        Fireball f = e.getPlayer().getWorld().spawn(loc, Fireball.class);
                        if (pf.containsKey(e.getPlayer()))
                            pf.remove(e.getPlayer());
                        pf.put(f, e.getPlayer());
                        if (!shooters.contains(e.getPlayer()))
                            shooters.add(e.getPlayer());
                        f.setVelocity(e.getPlayer().getEyeLocation().getDirection().multiply(2));
                        break;
                    case REPULSION:
                        Snowball s = e.getPlayer().getWorld().spawn(loc, Snowball.class);
                        s.setShooter(e.getPlayer());
                        if (pv.containsKey(e.getPlayer()))
                            pv.remove(e.getPlayer());
                        pv.put(e.getPlayer(), e.getPlayer().getLocation().getDirection().normalize());
                        if (!shooters.contains(e.getPlayer()))
                            shooters.add(e.getPlayer());
                        s.setVelocity(e.getPlayer().getEyeLocation().getDirection().multiply(2));
                        break;
                    case TELEPORTER:
                        e.getPlayer().launchProjectile(EnderPearl.class);
                        if (!shooters.contains(e.getPlayer()))
                            shooters.add(e.getPlayer());
                        break;
                    case WITHERSKULL:
                        WitherSkull ws = e.getPlayer().getWorld().spawn(loc, WitherSkull.class);
                        if (pws.containsKey(e.getPlayer()))
                            pws.remove(e.getPlayer());
                        pws.put(e.getPlayer(), ws);
                        if (!shooters.contains(e.getPlayer()))
                            shooters.add(e.getPlayer());
                        ws.setShooter(e.getPlayer());
                        ws.setVelocity(e.getPlayer().getEyeLocation().getDirection().multiply(2));
                        break;
                    default:
                        e.getPlayer().sendMessage(ChatColor.RED + "Ошибка! Эффект для предмета " + ChatColor.GOLD
                                + keys + ChatColor.RED + " не установлен или отсутствует!");
                        break;
                }
            }
        }
    }

    @EventHandler
    public void PlayerTeleport(PlayerTeleportEvent e) {
        if(e.getCause().equals(PlayerTeleportEvent.TeleportCause.ENDER_PEARL) &&
                shooters.contains(e.getPlayer())) {
            shooters.remove(e.getPlayer());
            e.setCancelled(true);
        }
    }
   
    public boolean canPvP(Location location) {
        if (Main.getWG() == null) {
            return true;
        }
        return Main.getWG().getRegionManager(location.getWorld()).getApplicableRegions(location).allows(DefaultFlag.PVP);
    }

    @EventHandler
    public void EntityDamageByEntity(EntityDamageByEntityEvent e) {
        if (!canPvP(e.getEntity().getLocation())) return;
        if (e.getEntity().getType() == EntityType.PLAYER) {
            if (e.getDamager() instanceof Fireball) {
                Fireball f = (Fireball) e.getDamager();
                if (pf.containsKey(f) && shooters.contains(pf.get(f))) {
                    final Player a = (Player) e.getEntity();
                    a.damage(6); //Забирает 3 сердечка
                    shooters.remove(pf.get(f));
                    for (Player p : Bukkit.getOnlinePlayers())
                        try {
                            ParticleEffects.HUGE_EXPLOSION.sendToPlayer(p, e.getEntity().getLocation(), 1, 1, 1, 12F, 1);
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }
                        Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(),
                            new Runnable() {
                                @Override
                                public void run() {
                                    a.getWorld().strikeLightning(a.getLocation());
                                }
                            }, 40L);
                }
            }
            if (e.getDamager().getType() == EntityType.WITHER_SKULL && pws.containsKey(((WitherSkull) e.getDamager()).getShooter())
                    || e.getDamager().getType() == EntityType.PLAYER && pws.containsKey(e.getDamager())) {
                if (((Player) e.getEntity()).getActivePotionEffects().contains(PotionEffectType.WITHER))
                    ((Player) e.getEntity()).removePotionEffect(PotionEffectType.WITHER);
                ((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 200, 4));
                shooters.remove(e.getDamager());
                ((Player) e.getEntity()).damage(10); //Забирает 5 сердечка
            }

            if (e.getDamager() instanceof EnderPearl) {
                EnderPearl ep = (EnderPearl) e.getDamager();
                if (ep.getShooter() instanceof Player && shooters.contains(ep.getShooter())) {
                    HashMap<Player, Location> b = new HashMap<Player, Location>();
                    b.put((Player) e.getEntity(), e.getEntity().getLocation());
                    b.put((Player) ep.getShooter(), ep.getShooter().getLocation());
                    e.getEntity().teleport(b.get((Player) ep.getShooter()));
                    ep.getShooter().teleport(b.get((Player) e.getEntity()));
                    b.clear();
                    for (Player p : Bukkit.getOnlinePlayers())
                        try {
                            ParticleEffects.PORTAL.sendToPlayer(p, e.getEntity().getLocation(), 2, 2, 2, 12F, 50);
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }
                }
                if (shooters.contains(ep.getShooter()))
                    shooters.remove(ep.getShooter());
                e.setCancelled(true);
            }
            if (e.getDamager() instanceof Snowball) {
                Snowball s = (Snowball) e.getDamager();
                if (s.getShooter() instanceof Player && shooters.contains(s.getShooter())) {
                    Player a = (Player) e.getEntity();
                    a.setVelocity(pv.get(s.getShooter()).setY(0.3).multiply(4));
                    pv.remove(s.getShooter());
                    for (Player p : Bukkit.getOnlinePlayers()) {
                        try {
                            ParticleEffects.FLAME.sendToPlayer(p, a.getLocation(), 1, 1, 1, 0F, 10);
                            ParticleEffects.PORTAL.sendToPlayer(p, a.getLocation(), 2, 2, 2, 0F, 10);
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }
                    }
                    shooters.remove(s.getShooter());
                    a.damage(6); //Забирает 3 сердечка
                }
            }
        }
    }

}

Вот код в котором нужно разрешить бить NPC-ботов в зоне без PvP
 
В методе canPvp замени всё на "return true;".
 
Назад
Верх