Напиши скрипт для custom npc, что нас при стрельбе в него из лука исчезал и появлялся сзади игрока, а потом сразу же наносил ему удар.
java
public class CustomNPC extends BukkitRunnable {
private final Player player;
private final Entity npc;
private final List<Entity> nearbyEntities;
public CustomNPC(Player player, Entity npc) {
this.player = player;
this.npc = npc;
this.nearbyEntities = new ArrayList<>();
npc.setCustomName("Custom NPC");
npc.setCustomNameVisible(true);
}
@Override
public void run() {
if (player.isDead() || player.getHealth() <= 0) {
npc.remove();
cancel();
return;
}
if (player.getLocation().distance(npc.getLocation()) <= 3) {
// Атаковать игрока
player.damage(5);
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1f, 1f);
}
}
public void teleportBehindPlayer() {
Location playerLocation = player.getLocation();
Location npcLocation = npc.getLocation();
double newX = playerLocation.getX() - Math.cos(Math.toRadians(playerLocation.getYaw() + 180)) * 2;
double newY = playerLocation.getY();
double newZ = playerLocation.getZ() - Math.sin(Math.toRadians(playerLocation.getYaw() + 180)) * 2;
npc.teleport(new Location(playerLocation.getWorld(), newX, newY, newZ, npcLocation.getYaw(), npcLocation.getPitch()));
}
public void start() {
nearbyEntities.addAll(npc.getNearbyEntities(10, 10, 10));
npc.setInvulnerable(true);
npc.setInvisible(true);
npc.getWorld().spawnParticle(Particle.SMOKE_LARGE, npc.getLocation(), 10);
Bukkit.getScheduler().runTaskTimer(plugin, this, 0, 20);
Bukkit.getScheduler().runTaskLater(plugin, () -> {
teleportBehindPlayer();
npc.getWorld().spawnParticle(Particle.SMOKE_LARGE, npc.getLocation(), 10);
npc.setInvisible(false);
}, 40);
Bukkit.getScheduler().runTaskLater(plugin, () -> {
npc.setInvulnerable(false);
}, 50);
}
}
Этот код создает класс `CustomNPC`, который расширяет класс `BukkitRunnable`. Он принимает игрока (`Player`) и сущность NPC (`Entity`) в качестве параметров.
В конструкторе устанавливаются имя и видимость существа NPC. Затем в методе `run()` проверяется, жив ли игрок и находится ли он рядом с NPC. Если игрок находится рядом с NPC, игроку будет нанесен урон и воспроизведен звук получения урона.
Метод `teleportBehindPlayer()` используется для перемещения NPC за спину игрока. Он использует синус и косинус, чтобы рассчитать новые координаты для NPC на основе положения и ориентации игрока.
В методе `start()` мы добавляем всех существ, находящихся в радиусе 10 блоков от NPC, в список `nearbyEntities`. Затем NPC делается неуязвимым и невидимым. В данном примере мы используем частицы дыма для визуализации действия. Затем используется планировщик задач Bukkit для запуска кода `run()` каждую секунду (`runTaskTimer(plugin, this, 0, 20)`), чтобы проверять, находится ли игрок рядом с NPC. Метод `teleportBehindPlayer()` вызывается через 2 секунды (`runTaskLater(plugin, () -> {...}, 40)`), после чего NPC становится видимым. Через 5 секунд (`runTaskLater(plugin, () -> {...}, 50)`) NPC снова становится уязвимым.
Чтобы использовать этот скрипт в игре, вы можете создать существо NPC, например, с помощью команды `/summon`. Затем создайте экземпляр класса `CustomNPC` и вызовите метод `start()`, передав игрока и сущность NPC в качестве параметров. В нашем случае это может выглядеть примерно так:
java
Player player = /* получить игрока */;
Entity npc = /* получить существо NPC */;
CustomNPC customNPC = new CustomNPC(player, npc);
customNPC.start();
Исправьте команду `/summon`, `/*получить игрока*/` и `/*получить существо NPC */` в соответствии с вашими нуждами.
Важно отметить, что для работы скрипта требуется использование плагина custom npc и языка программирования java и API Bukkit. Также учтите, что данный код является базовым примером и может потребовать доработки в зависимости от требований и конкретных условий вашего проекта.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет