1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Заспавнить жителя с определёнными торгами

Тема в разделе "Разработка плагинов для новичков", создана пользователем T0rr0, 28 окт 2023.

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

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

    Баллы:
    66
    Приветствую! Мне нужно заспавнить жителя с определёнными торгами с помощью плагина. Я знаю как заспавнить жителя без торгов, но не знаю как сделать жителя с торгами. Помогите пожалуйста

    код:
    final int radius = 1000;
    final EntityType entityType = EntityType.VILLAGER;
    final World world = e.getWorld();

    int x = ThreadLocalRandom.current().nextInt(-radius, radius);
    int z = ThreadLocalRandom.current().nextInt(-radius, radius);
    int y = world.getHighestBlockYAt(x, z);
    Location location = new Location(world, x, y, z);

    world.spawnEntity(location, entityType);
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
  3. Автор темы
    T0rr0

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

    Баллы:
    66
    А что такое "кастовать"? Вообще не шарю..
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    https://youtube.com/results?search_query=java+приведение+типов

    В твоем случае нужно явно скатить (привести) тип Entity к типу Villager:
    Villager villager = (Villager) world.spawnEntity(location, entityType);
    И после этого уже используешь на villager'е методы, которые кинул выше
     
  5. Автор темы
    T0rr0

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

    Баллы:
    66
    Вроде всё делаю правильно, но не получается. Мучаюсь весь день, прогресс конечно есть, но именно торгов у жителя по прежнему нету.. (а ещё у него нет профессии, не смотря на то, что я вроде дал ему эту профессию

    код:
    final int radius = 1000;
    final EntityType entityType = EntityType.VILLAGER;
    final World world = e.getWorld();

    int x = ThreadLocalRandom.current().nextInt(-radius, radius);
    int z = ThreadLocalRandom.current().nextInt(-radius, radius);
    int y = world.getHighestBlockYAt(x, z);
    Location location = new Location(world, x, y, z);

    Villager villager = (Villager) world.spawnEntity(location, entityType);
    villager.setProfession(Villager.Profession.LIBRARIAN);
    villager.setVillagerType(Villager.Type.SWAMP);
    villager.setGlowing(true);
    villager.setInvulnerable(true);
    villager.setGravity(true);
    villager.setAware(true);
    ItemStack item = new ItemStack(Material.DIAMOND_PICKAXE);
    item.addEnchantment(Enchantment.DIG_SPEED, 5);
    ItemStack item2 = new ItemStack(Material.PUMPKIN, 64);
    MerchantRecipe recipe = new MerchantRecipe(item, 1);
    recipe.addIngredient(item2);
    villager.setRecipe(1, recipe);
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Установи Villager'у уровень от 2 до 5-го, почему на 1-м не работает - ХЗ.
    villager.setVillagerLevel(2);

    Также учти, что счёт индексов в массивах и листах в Java начинается с нуля. Поэтому если ты хочешь заменить первый торг - используй число 0:
    villager.setRecipe(0, recipe);

    Но, вообще, я бы рекомендовал вместо этого ограничить количество торгов примерно таким образом:
    villager.setRecipes(Arrays.asList(recipe));
     
  7. Автор темы
    T0rr0

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

    Баллы:
    66
    Спасибо большущее за помощь! Но у меня остался последний (надеюсь) вопрос.
    Искал, не нашёл, как мне кильнуть этого жителя через 5 минут?
     
  8. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Если с анимацией смерти, то
    villager.damage(villager.getHealth());
    если моментально, то
    villager.remove();

    Задачей шедулера с задеркой в 5 минут (или же 5 * 60 * 20 тиков).
    Про шедулеры можно тут почитать: https://rubukkit.org/threads/184419

    Но учти, что задача шедулера может быть отменена от выключении сервера или плагина
     
    Последнее редактирование: 30 окт 2023
  9. Автор темы
    T0rr0

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

    Баллы:
    66
    Увы, но вопрос был не последний..
    По какой-то причине не хочет работать убийство жителя внутри задачи, хотя оповещение работает.
    код:

    final int radius = 1000;
    final EntityType entityType = EntityType.VILLAGER;
    final World world = e.getWorld();
    String name = "halloween";
    Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(name);

    int x = ThreadLocalRandom.current().nextInt(-radius, radius);
    int z = ThreadLocalRandom.current().nextInt(-radius, radius);
    int y = world.getHighestBlockYAt(x, z);
    y = y+1;
    Location location = new Location(world, x, y, z);

    Villager villager = (Villager) world.spawnEntity(location, entityType);
    villager.setProfession(Villager.Profession.LIBRARIAN);
    villager.setVillagerType(Villager.Type.SWAMP);
    villager.setGlowing(true);
    villager.setInvulnerable(true);
    villager.setGravity(true);
    villager.setAware(true);
    villager.setVillagerLevel(1);
    villager.setAI(false);
    ItemStack item = new ItemStack(Material.DIAMOND_PICKAXE);
    item.addEnchantment(Enchantment.DIG_SPEED, 5);
    ItemStack item2 = new ItemStack(Material.PUMPKIN, 64);
    MerchantRecipe recipe = new MerchantRecipe(item, 3);
    recipe.addIngredient(item2);
    villager.setRecipes(Arrays.asList(recipe));
    for (Player p : getServer().getOnlinePlayers())
    p.sendMessage("текст! координаты: "+x+" "+y+" "+z);
    for(Player players : getServer().getOnlinePlayers()) {
    players.playSound(players.getLocation(), Sound.ENTITY_LIGHTNING_BOLT_THUNDER, 1, 0);
    }
    Server server = plugin.getServer();
    int delay = 30;
    BukkitTask task = server.getScheduler().runTaskLater(plugin, () -> {
    villager.remove();
    server.broadcastMessage("текст!");
    }, delay * 20L);


    p.s. пробовал разместить не в задаче, получилось, работает. Но житель умирает как только заспавнился, а это не то, что мне нужно(
     
  10. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Есть ошибки в консоли? Вообще, у меня твой код работает. Житель спаунится и через 30 сек удаляется.
    Только я при тесте спаунил Villager'а возле себя, а не на рандомных координатах
     
    Последнее редактирование: 30 окт 2023
  11. Автор темы
    T0rr0

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

    Баллы:
    66
    Ошибок нету. После спауна я к нему тепаюсь и стою возле него, так что хз в чём проблема..
     
  12. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    А сообщение в консоль выводит?
     
  13. Автор темы
    T0rr0

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

    Баллы:
    66
    Выводит только:
    текст!
    (то, что я тут указал)
     
  14. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Странно. А если рядом с собой жителя спаунишь, то удаляет?
     

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