Кароч я хотел сделать тп лук, у меня получилось разместить его на 3 файла:
Описание лука:
package com.na.ru.noneadmin.utils;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
public class TPBowUtil {
public static ItemStack getTPBow(){
ItemStack bow = new ItemStack(Material.BOW);
ItemMeta meta = bow.getItemMeta();
meta.addEnchant(Enchantment.ARROW_INFINITE, 1, true);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
meta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE);
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&b[&eTP BOW&B]&r"));
ArrayList<String> lore = new ArrayList<>();
lore.add("This bow can");
lore.add("teleport you!");
meta.setLore(lore);
meta.setUnbreakable(true);
bow.setItemMeta(meta);
return bow;
}
}
Комманда выдачи лука:
package com.na.ru.noneadmin.commands;
import com.na.ru.noneadmin.utils.TPBowUtil;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class tpbowCMD implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
if (!(sender instanceof Player)){
sender.sendMessage(ChatColor.RED+"This command only for players!");
return true;
}
Player p = (Player) sender;
// TPBowUtil item = new TPBowUtil();
// ItemStack thing = item.getTPBow();
ItemStack thing = TPBowUtil.getTPBow();
if (!(p.getInventory().contains(thing))){
p.getInventory().addItem(thing);
if (!(p.getInventory().contains(new ItemStack(Material.ARROW)))){
p.getInventory().addItem(new ItemStack(Material.ARROW));
}
p.playSound(p.getLocation(),Sound.ENTITY_EXPERIENCE_ORB_PICKUP,2.0f,2.0f);
return true;
}
p.sendMessage(ChatColor.YELLOW+"U also have tp bow!");
return true;
}
}
Евент на стрелу:
package com.na.ru.noneadmin.events;
import com.na.ru.noneadmin.utils.TPBowUtil;
import org.bukkit.Sound;
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.ProjectileHitEvent;
import org.bukkit.inventory.ItemStack;
public class onEntityFFallToDown implements Listener {
@EventHandler
public void onMagicArrow(ProjectileHitEvent e){
if (e.getEntity().getType() == EntityType.ARROW){
if (e.getEntity().getShooter() instanceof Player){
Player p = (Player) e.getEntity().getShooter();
ItemStack item = TPBowUtil.getTPBow();
if (p.getInventory().getItemInMainHand().isSimilar(item)) {
if (e.getHitEntity() == null){
p.teleport(e.getEntity().getLocation());
e.getEntity().remove();
p.playSound(p.getLocation(), Sound.ENTITY_ENDERMEN_TELEPORT, 1.5f,1.5f);
}else {
LivingEntity ent = (LivingEntity) e.getHitEntity();
double hel = ent.getHealth() + ((LivingEntity) e.getHitEntity()).getLastDamage();
ent.setHealth(hel);
e.getEntity().remove();
p.getInventory().remove(item);
p.playSound(p.getLocation(), Sound.ENTITY_ITEM_BREAK,1.5f,1.5f);
}
}}
}
}
}
+ регистратор евента и комманды
и + комманда в plugin.yml
И как бы это всё работает, но не идеально
То есть у меня в файле Евента прописано, что при поподании стрелы в сущность (включая игрока), лук будет исчезать из инвентаря, но из 10 раз не работает раза 2, выдавая ошибку:
[21:29:52] [Server thread/ERROR]: Could not pass event ProjectileHitEvent to NoneAdmin v1.0
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callProjectileHitEvent(CraftEventFactory.java:803) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.EntityArrow.a(EntityArrow.java:259) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.EntityArrow.B_(EntityArrow.java:194) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.EntityTippedArrow.B_(EntityTippedArrow.java:86) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.World.entityJoinedWorld(World.java:1631) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.World.h(World.java:1601) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.World.tickEntities(World.java:1435) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.WorldServer.tickEntities(WorldServer.java:668) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:817) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_361]
Caused by: java.lang.IllegalArgumentException: Health must be between 0 and 20.0(24.666667938232422)
at org.bukkit.craftbukkit.v1_12_R1.entity.CraftLivingEntity.setHealth(CraftLivingEntity.java:97) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
at com.na.ru.noneadmin.events.onEntityFFallToDown.onMagicArrow(onEntityFFallToDown.java:33) ~[?:?]
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_361]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_361]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-f4830a1]
... 16 more
Ошибка вылезает редко, и вроде только при попадании в Ентити
(При попадании в Ентити, должен удяляться лук, воспроизводится звук ломания предмета и возвращать хп, которые отнялись)
Сразу говорю что всё подключено, и работает стабильно кроме этого
Есть предположения в чём дело?
Кста, ядро и плагин на 1.12.2
+ не обращайте внимание на то что я использую проверку только на главную руку, потом на вторую тоже добавлю