Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин [MECH]AirBall v-1.5 Воздушные шарики для вашего сервера [1.10.*],[1.11.*]

Derik

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Derik
AirBall v-1.5

ogRkfauirH8.jpg


Этот плагин добавит воздушные шарики на ваш сервер.

Шарики крафтятся в верстаке. Из цветного стекла, ока эндера и поводка.

rnhBGG4Dbps.jpg


Цвет шарика зависит от цвета стекла.
Что бы запустить шарик просто бросьте его клавишей Q. Затем ловите его поводком, пока не улетел.)))
Что бы удалить шарик, стрельните в него из лука, или проткните его мечем.

история версий:

AirBall v1.1
- релиз
AirBall v1.2
- Оптимизирован код
- Шарики теперь выглядят реалистичней.
Убраны баги:
- Убрана невидимая стойка. Которая падала и не убиралась.
- Шарики взрываются по одному а не кучей.
- Шарики не дропают опыт.
AirBall v1.3
- Добавлена поддержка второй руки
Убран баг:
- дюп поводков.
AirBall v1.4
Убраны баги:
- Шарик больше не появляется с броней
- Шарик не подбирает дроп.
AirBallv1.5
- Добавлен конфиг
- Теперь возможно изменить названия и описания шариков, через конфиг.
Убраны баги:
- Не выкидывались некоторые предметы из инвентаря.
- Шарики не излучают частиц от эффектов.

скачать
AirBall-v1.5


P.S Огромное спасибо Dereku за помощь.
 
Последнее редактирование:
Еще бы кастомный крафт, и шарики висящие на поводке (а не метром выше), и была бы вкусняшка)
Хотя код лень смотреть, может это и редкосная какаха :D
 
Ты слышал что такое цикл?
Код:
    this.wool1 = new ItemStack(Material.WOOL, 1, 1);
    ItemMeta meta1 = this.wool1.getItemMeta();
    meta1.setDisplayName("Ораньжевый шарик.");
    List lore1 = new ArrayList();
    lore1.add("Кинь его на землю для запуска.");
    meta1.setLore(lore1);
    this.wool1.setItemMeta(meta1);

    ShapedRecipe r1 = new ShapedRecipe(this.wool1);
    r1.shape(new String[] { "S S", " E ", " L " });
    r1.setIngredient('S', Material.STAINED_GLASS, 1);
    r1.setIngredient('E', Material.EYE_OF_ENDER);
    r1.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r1);

    this.wool2 = new ItemStack(Material.WOOL, 1, 2);
    ItemMeta meta2 = this.wool2.getItemMeta();
    meta2.setDisplayName("Пурпурный шарик.");
    List lore2 = new ArrayList();
    lore2.add("Кинь его на землю для запуска.");
    meta2.setLore(lore2);
    this.wool2.setItemMeta(meta2);

    ShapedRecipe r2 = new ShapedRecipe(this.wool2);
    r2.shape(new String[] { "S S", " E ", " L " });
    r2.setIngredient('S', Material.STAINED_GLASS, 2);
    r2.setIngredient('E', Material.EYE_OF_ENDER);
    r2.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r2);

    this.wool3 = new ItemStack(Material.WOOL, 1, 3);
    ItemMeta meta3 = this.wool3.getItemMeta();
    meta3.setDisplayName("Голубой шарик.");
    List lore3 = new ArrayList();
    lore3.add("Кинь его на землю для запуска.");
    meta3.setLore(lore3);
    this.wool3.setItemMeta(meta3);

    ShapedRecipe r3 = new ShapedRecipe(this.wool3);
    r3.shape(new String[] { "S S", " E ", " L " });
    r3.setIngredient('S', Material.STAINED_GLASS, 3);
    r3.setIngredient('E', Material.EYE_OF_ENDER);
    r3.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r3);

    this.wool4 = new ItemStack(Material.WOOL, 1, 4);
    ItemMeta meta4 = this.wool4.getItemMeta();
    meta4.setDisplayName("Желтый шарик.");
    List lore4 = new ArrayList();
    lore4.add("Кинь его на землю для запуска.");
    meta4.setLore(lore4);
    this.wool4.setItemMeta(meta4);

    ShapedRecipe r4 = new ShapedRecipe(this.wool4);
    r4.shape(new String[] { "S S", " E ", " L " });
    r4.setIngredient('S', Material.STAINED_GLASS, 4);
    r4.setIngredient('E', Material.EYE_OF_ENDER);
    r4.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r4);

    this.wool5 = new ItemStack(Material.WOOL, 1, 5);
    ItemMeta meta5 = this.wool5.getItemMeta();
    meta5.setDisplayName("Лаймовый шарик.");
    List lore5 = new ArrayList();
    lore5.add("Кинь его на землю для запуска.");
    meta5.setLore(lore5);
    this.wool5.setItemMeta(meta5);

    ShapedRecipe r5 = new ShapedRecipe(this.wool5);
    r5.shape(new String[] { "S S", " E ", " L " });
    r5.setIngredient('S', Material.STAINED_GLASS, 5);
    r5.setIngredient('E', Material.EYE_OF_ENDER);
    r5.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r5);

    this.wool6 = new ItemStack(Material.WOOL, 1, 6);
    ItemMeta meta6 = this.wool6.getItemMeta();
    meta6.setDisplayName("Розовый шарик.");
    List lore6 = new ArrayList();
    lore6.add("Кинь его на землю для запуска.");
    meta6.setLore(lore6);
    this.wool6.setItemMeta(meta6);

    ShapedRecipe r6 = new ShapedRecipe(this.wool6);
    r6.shape(new String[] { "S S", " E ", " L " });
    r6.setIngredient('S', Material.STAINED_GLASS, 6);
    r6.setIngredient('E', Material.EYE_OF_ENDER);
    r6.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r6);

    this.wool7 = new ItemStack(Material.WOOL, 1, 7);
    ItemMeta meta7 = this.wool7.getItemMeta();
    meta7.setDisplayName("Серый шарик.");
    List lore7 = new ArrayList();
    lore7.add("Кинь его на землю для запуска.");
    meta7.setLore(lore7);
    this.wool7.setItemMeta(meta7);

    ShapedRecipe r7 = new ShapedRecipe(this.wool7);
    r7.shape(new String[] { "S S", " E ", " L " });
    r7.setIngredient('S', Material.STAINED_GLASS, 7);
    r7.setIngredient('E', Material.EYE_OF_ENDER);
    r7.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r7);

    this.wool8 = new ItemStack(Material.WOOL, 1, 8);
    ItemMeta meta8 = this.wool8.getItemMeta();
    meta8.setDisplayName("Светло - Серый шарик.");
    List lore8 = new ArrayList();
    lore8.add("Кинь его на землю для запуска.");
    meta8.setLore(lore8);
    this.wool8.setItemMeta(meta8);

    ShapedRecipe r8 = new ShapedRecipe(this.wool8);
    r8.shape(new String[] { "S S", " E ", " L " });
    r8.setIngredient('S', Material.STAINED_GLASS, 8);
    r8.setIngredient('E', Material.EYE_OF_ENDER);
    r8.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r8);

    this.wool9 = new ItemStack(Material.WOOL, 1, 9);
    ItemMeta meta9 = this.wool9.getItemMeta();
    meta9.setDisplayName("Бирюзовый шарик.");
    List lore9 = new ArrayList();
    lore9.add("Кинь его на землю для запуска.");
    meta9.setLore(lore9);
    this.wool9.setItemMeta(meta9);

    ShapedRecipe r9 = new ShapedRecipe(this.wool9);
    r9.shape(new String[] { "S S", " E ", " L " });
    r9.setIngredient('S', Material.STAINED_GLASS, 9);
    r9.setIngredient('E', Material.EYE_OF_ENDER);
    r9.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r9);

    this.wool10 = new ItemStack(Material.WOOL, 1, 10);
    ItemMeta meta10 = this.wool10.getItemMeta();
    meta10.setDisplayName("Фиолетовый шарик.");
    List lore10 = new ArrayList();
    lore10.add("Кинь его на землю для запуска.");
    meta10.setLore(lore10);
    this.wool10.setItemMeta(meta10);

    ShapedRecipe r10 = new ShapedRecipe(this.wool10);
    r10.shape(new String[] { "S S", " E ", " L " });
    r10.setIngredient('S', Material.STAINED_GLASS, 10);
    r10.setIngredient('E', Material.EYE_OF_ENDER);
    r10.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r10);

    this.wool11 = new ItemStack(Material.WOOL, 1, 11);
    ItemMeta meta11 = this.wool11.getItemMeta();
    meta11.setDisplayName("Синий шарик.");
    List lore11 = new ArrayList();
    lore11.add("Кинь его на землю для запуска.");
    meta11.setLore(lore11);
    this.wool11.setItemMeta(meta11);

    ShapedRecipe r11 = new ShapedRecipe(this.wool11);
    r11.shape(new String[] { "S S", " E ", " L " });
    r11.setIngredient('S', Material.STAINED_GLASS, 11);
    r11.setIngredient('E', Material.EYE_OF_ENDER);
    r11.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r11);

    this.wool12 = new ItemStack(Material.WOOL, 1, 12);
    ItemMeta meta12 = this.wool12.getItemMeta();
    meta12.setDisplayName("Коричневый шарик.");
    List lore12 = new ArrayList();
    lore12.add("Кинь его на землю для запуска.");
    meta12.setLore(lore12);
    this.wool12.setItemMeta(meta12);

    ShapedRecipe r12 = new ShapedRecipe(this.wool12);
    r12.shape(new String[] { "S S", " E ", " L " });
    r12.setIngredient('S', Material.STAINED_GLASS, 12);
    r12.setIngredient('E', Material.EYE_OF_ENDER);
    r12.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r12);

    this.wool13 = new ItemStack(Material.WOOL, 1, 13);
    ItemMeta meta13 = this.wool13.getItemMeta();
    meta13.setDisplayName("Зеленый шарик.");
    List lore13 = new ArrayList();
    lore13.add("Кинь его на землю для запуска.");
    meta13.setLore(lore13);
    this.wool13.setItemMeta(meta13);

    ShapedRecipe r13 = new ShapedRecipe(this.wool13);
    r13.shape(new String[] { "S S", " E ", " L " });
    r13.setIngredient('S', Material.STAINED_GLASS, 13);
    r13.setIngredient('E', Material.EYE_OF_ENDER);
    r13.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r13);

    this.wool14 = new ItemStack(Material.WOOL, 1, 14);
    ItemMeta meta14 = this.wool14.getItemMeta();
    meta14.setDisplayName("Красный шарик.");
    List lore14 = new ArrayList();
    lore14.add("Кинь его на землю для запуска.");
    meta14.setLore(lore14);
    this.wool14.setItemMeta(meta14);

    ShapedRecipe r14 = new ShapedRecipe(this.wool14);
    r14.shape(new String[] { "S S", " E ", " L " });
    r14.setIngredient('S', Material.STAINED_GLASS, 14);
    r14.setIngredient('E', Material.EYE_OF_ENDER);
    r14.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r14);

    this.wool15 = new ItemStack(Material.WOOL, 1, 15);
    ItemMeta meta15 = this.wool15.getItemMeta();
    meta15.setDisplayName("Черный шарик.");
    List lore15 = new ArrayList();
    lore15.add("Кинь его на землю для запуска.");
    meta15.setLore(lore15);
    this.wool15.setItemMeta(meta15);

    ShapedRecipe r15 = new ShapedRecipe(this.wool15);
    r15.shape(new String[] { "S S", " E ", " L " });
    r15.setIngredient('S', Material.STAINED_GLASS, 15);
    r15.setIngredient('E', Material.EYE_OF_ENDER);
    r15.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r15);

    this.wool16 = new ItemStack(Material.WOOL);
    ItemMeta meta16 = this.wool16.getItemMeta();
    meta16.setDisplayName("Белый шарик.");
    List lore16 = new ArrayList();
    lore16.add("Кинь его на землю для запуска.");
    meta16.setLore(lore16);
    this.wool16.setItemMeta(meta16);

    ShapedRecipe r16 = new ShapedRecipe(this.wool16);
    r16.shape(new String[] { "S S", " E ", " L " });
    r16.setIngredient('S', Material.STAINED_GLASS);
    r16.setIngredient('E', Material.EYE_OF_ENDER);
    r16.setIngredient('L', Material.LEASH);
    Bukkit.getServer().addRecipe(r16);
 
Как я названия переменных в цикле поменяю? Значение можно но не названия.
 
Пофиг, мне и так нормально. Не такой уж и большой код.
 

Наверное то, что Вы нерационально пользуетесь возможностями языка. Хороший кодер старается максимально сократить код для повышения удобства поддержки. А если Вам через год понадобится обновить свой плагин под новую версию баккита? Вы будете два часа разбираться в однообразном коде и затем вручную заменять кучу переменных в разных местах, когда можно было обойтись облегченными конструкциями и минимальными правками в дальнейшем?
 
Java:
LivingEntity sheep = (LivingEntity) location.getWorld().spawnEntity(location, EntityType.ZOMBIE);
Заорал.
И проверял бы "овцу" на null - иногда (в редких случаях, хорошо) entity не спаунится.
Java:
@EventHandler
public void killDrop(EntityDeathEvent e) {
    LivingEntity entity = e.getEntity();

    if (entity != null) {
        e.getDrops().clear();
        e.setDroppedExp(0);
    }
}
Шоб попец ни у кого не слипся?
Java:
entity.getCustomName() == "ball"
String#equals(String)

Ну и по традиции (лел, дерекс традишнс):
Java:
package me.derik;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.*********ventory.ItemStack;
import org.*********ventory.ShapedRecipe;
import org.*********ventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

public class AirBall extends JavaPlugin implements Listener {

    private final static String[] WOOL_COLORS = new String[]{
        "Белый", "Оранжевый", "Пурпурный", "Голубой", "Желтый", "Лаймовый",
        "Розовый", "Серый", "Светло-серый", "Бирюзовый", "Фиолетовый", "Синий",
        "Коричневый", "Зеленый", "Красный", "Черный"
    };
    private final static String BALOON = " шарик";
    private final static String SUFFIX
            = ChatColor.BLUE.toString() + ChatColor.AQUA.toString()
            + ChatColor.LIGHT_PURPLE.toString() + ChatColor.RESET.toString();

    private final static List<String> BALOON_LORE = Arrays.asList(
            new String[]{"Кинь его на землю для запуска."}
    );
    private final HashMap<String, ItemStack> baloons = new HashMap<>();

    @Override
    public void onEnable() {
        this.createCraft();
        Bukkit.getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onBaloonDrop(PlayerDropItemEvent e) {
        if (!e.getItemDrop().getItemStack().getType().equals(Material.WOOL)) {
            return;
        }

        if (!e.getItemDrop().getItemStack().hasItemMeta()) {
            return;
        }

        ItemStack wool = e.getItemDrop().getItemStack();
        Location location = e.getItemDrop().getLocation();
        String name = wool.getItemMeta().getDisplayName();
        List lore = wool.getItemMeta().getLore();

        if (name == null || name.equals("")) {
            return;
        }

        if (lore == null || lore.isEmpty()) {
            return;
        }

        if (!this.baloons.containsKey(name)) {
            return;
        }
        // А вот тут ломается совместимость с плагинами, 
        // которые вешают в лор всякую ерунду. Да, специально.
        if (!AirBall.BALOON_LORE.containsAll(lore)) {
            return;
        }

        location.setY(location.getY() - 2.0D);
        for (int a = 0; a < wool.getAmount(); a++) {
            this.createBaloon(location, e.getItemDrop().getItemStack());
        }

        e.getItemDrop().remove();
    }

    @EventHandler
    public void bollLeash(PlayerInteractEntityEvent e) {
        Entity entity = e.getRightClicked();
        Player player = e.getPlayer();

        //Вообще спорная проверка. Я могу и не держать поводок в руках.
        boolean hasLeashInMainHand = player.getInventory().getItemInMainHand().getType().equals(Material.LEASH),
                hasLeashInOffHand = player.getInventory().getItemInOffHand().getType().equals(Material.LEASH);
        if (!hasLeashInMainHand && !hasLeashInOffHand) {
            return;
        }

        //Не верю что это может быть null.
        if (entity == null) {
            return;
        }

        if (entity instanceof LivingEntity && this.baloons.containsKey(entity.getCustomName())) {
            ((LivingEntity) entity).setLeashHolder(player);
            e.setCancelled(true);
        }
    }

    @EventHandler
    public void onEntityDeath(EntityDeathEvent e) {
        LivingEntity entity = e.getEntity();

        if (entity != null && this.baloons.containsKey(entity.getCustomName())) {
            e.getDrops().clear();
            e.setDroppedExp(0);
        }
    }

    public void createCraft() {
        for (int i = 0; i < 15; ++i) {
            ItemStack baloon = new ItemStack(Material.WOOL, 1, (short) i);
            ItemMeta meta = baloon.getItemMeta();
            meta.setDisplayName(AirBall.WOOL_COLORS[i].concat(AirBall.BALOON).concat(AirBall.SUFFIX));
            meta.setLore(AirBall.BALOON_LORE);
            baloon.setItemMeta(meta);
            this.baloons.put(meta.getDisplayName(), baloon);

            ShapedRecipe r = new ShapedRecipe(baloon);
            r.shape(new String[]{"S S", " E ", " L "});
            r.setIngredient('S', Material.STAINED_GLASS, (short) i);
            r.setIngredient('E', Material.EYE_OF_ENDER);
            r.setIngredient('L', Material.LEASH);
            this.getServer().addRecipe(r);
        }
    }

    public void createBaloon(Location location, ItemStack hat) {
        LivingEntity baloonEntity = (LivingEntity) location.getWorld().spawnEntity(location, EntityType.SILVERFISH);
        baloonEntity.getEquipment().clear();
        baloonEntity.setCustomName(hat.getItemMeta().getDisplayName());
        baloonEntity.setHealth(1.0D);
        baloonEntity.setSilent(true);
        baloonEntity.getEquipment().setHelmet(hat);
        baloonEntity.addPotionEffect(new PotionEffect(PotionEffectType.LEVITATION, Short.MAX_VALUE, 1));
        baloonEntity.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Short.MAX_VALUE, 1));
    }
}
Разумеется не проверял, но должно работать.
 
Шоб попец ни у кого не слипся?
Перезалил, это я что то конкретно лоханулся. Хотел просто что бы с шариков дроп не падал а не со всех мобов.:lol:
Да и с двумя руками круто придумал. Например в одной шарик в другой поводок и сразу ловиш, чтобы не переключаться.

Тоже орнул :D
Этот зомби в душе овца...
Там овцы раньше летали, влом было переменную переписывать.
 
Последнее редактирование:
meta.setDisplayName(this.woolname[(i - 1)] + " шарик");
Почему так не сделать?
а на 1.8.8 слабо сделать?
 

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

Назад
Верх