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

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

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    MrAlexei
    Вообщем есть у меня плагин (http://rubukkit.org/threads/plagin-na-novye-rpg-predmety.117045/) который мне написали за 800 рублей, мне нужно чтобы появилась возможность бить NPC-ботов (Из плагина Citizens в Sentry) в регионе без PvP. Такая возможность есть в плагине RPGItems, но я не пойму как это сделать...
    Пробовал:
    Код:
      if (!canPvP(e.getEntity().getLocation()) && Sentry.getSentry(e.getEntity()) == null) return;
    Но не помогло...
     
  2. Хостинг MineCraft
    <
  3. kirr9999

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

    Баллы:
    103
    Ну вот и попроси человека, который делал тебе плагин, переписать. А так, для того, чтобы узнать, как это сделать, нужно хотя бы видеть код плагина и вносить в него изменения) Тут же не экстрасенсы сидят, которые сходу могут точно сказать: "Измени в строчке n класса A b на c".
     
  4. Автор темы
    AlexeiGL

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

    Баллы:
    76
    Имя в Minecraft:
    MrAlexei
    Код:
    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 сердечка
                    }
                }
            }
        }
    
    }
    
    [DOUBLEPOST=1455440726,1455440687][/DOUBLEPOST]Вот код в котором нужно разрешить бить NPC-ботов в зоне без PvP
     
  5. kirr9999

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

    Баллы:
    103
    В методе canPvp замени всё на "return true;".
     
  6. Автор темы
    AlexeiGL

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

    Баллы:
    76
    Имя в Minecraft:
    MrAlexei
    не помогло[DOUBLEPOST=1456217608,1455965510][/DOUBLEPOST]Up
     

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