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

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

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);
 
А что такое "кастовать"? Вообще не шарю..
 
А что такое "кастовать"? Вообще не шарю..
https://youtube.com/results?search_query=java+приведение+типов

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

код:
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);
 
Вроде всё делаю правильно, но не получается. Мучаюсь весь день, прогресс конечно есть, но именно торгов у жителя по прежнему нету.. (а ещё у него нет профессии, не смотря на то, что я вроде дал ему эту профессию

код:
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);
Установи Villager'у уровень от 2 до 5-го, почему на 1-м не работает - ХЗ.
villager.setVillagerLevel(2);

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

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

Если с анимацией смерти, то
villager.damage(villager.getHealth());
если моментально, то
villager.remove();

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

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

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. пробовал разместить не в задаче, получилось, работает. Но житель умирает как только заспавнился, а это не то, что мне нужно(
 
Увы, но вопрос был не последний..
По какой-то причине не хочет работать убийство жителя внутри задачи, хотя оповещение работает.
код:

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. пробовал разместить не в задаче, получилось, работает. Но житель умирает как только заспавнился, а это не то, что мне нужно(
Есть ошибки в консоли? Вообще, у меня твой код работает. Житель спаунится и через 30 сек удаляется.
Только я при тесте спаунил Villager'а возле себя, а не на рандомных координатах
 
Последнее редактирование:
Есть ошибки в консоли? Вообще, у меня твой код работает. Житель спаунится и через 30 сек удаляется.
Только я при тесте спаунил Villager'а возле себя, а не на рандомных координатах
Ошибок нету. После спауна я к нему тепаюсь и стою возле него, так что хз в чём проблема..
 

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

Назад
Верх