Недавно я написал код «Double Jump» для моего плагина, который также отменяет falldamage после успешного прыжка.Minecraft (Bukkit): Проблема с falldamage после «Doublejump»
Текущая проблема в том, что falldamage полностью удаляется, и я не мог понять, почему. Этот вопрос, по-видимому, представляет собой событие onFall
и .setAllowFlight(true);
от onMove
.
package at.skyblock.events;
import java.util.ArrayList;
import java.util.HashMap;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerToggleFlightEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import at.skyblok.SnowflakeUtil;
public class MovementHandler implements Listener {
private SnowflakeUtil pl;
private ArrayList<Player> jumpers = new ArrayList<Player>();
private HashMap<Player, Integer> cooldownTime = new HashMap<Player, Integer>();
private HashMap<Player, BukkitRunnable> cooldownTask = new HashMap<Player, BukkitRunnable>();
public MovementHandler(SnowflakeUtil pl) {
this.pl = pl;
}
@EventHandler
public void onFall(EntityDamageEvent e) {
if (e.getEntity() instanceof Player) {
if (e.getCause().equals(DamageCause.FALL)) {
Player p = (Player) e.getEntity();
if (jumpers.contains(p)) {
e.setCancelled(true);
jumpers.remove(p);
}
}
}
}
@EventHandler
public void onMove(final PlayerMoveEvent event) {
if (cooldownTime.containsKey(event.getPlayer()))
return;
if (event.getPlayer().getGameMode() != GameMode.CREATIVE
&& event.getPlayer().getLocation().getBlock().getRelative(BlockFace.DOWN).getType() != Material.AIR) {
event.getPlayer().sendMessage("ready");
event.getPlayer().setAllowFlight(true);
cooldownTime.put(event.getPlayer(), 5);
cooldownTask.put(event.getPlayer(), new BukkitRunnable() {
public void run() {
cooldownTime.put(event.getPlayer(), cooldownTime.get(event.getPlayer()) - 1);
if (cooldownTime.get(event.getPlayer()) == 0) {
cooldownTime.remove(event.getPlayer());
cooldownTask.remove(event.getPlayer());
jumpers.remove(event.getPlayer());
cancel();
}
}
});
cooldownTask.get(event.getPlayer()).runTaskTimer(pl, 20, 20);
}
}
@EventHandler(priority = EventPriority.HIGH)
public void onDoubleJump(PlayerToggleFlightEvent e) {
Player p = e.getPlayer();
if (!p.getGameMode().equals(GameMode.CREATIVE)) {
e.setCancelled(true);
p.setFlying(false);
p.setAllowFlight(false);
String type = "";
if (p.getInventory().getArmorContents() != null) {
for (ItemStack is : p.getInventory().getArmorContents()) {
if (is.hasItemMeta()) {
if (is.getItemMeta().hasLore()) {
for (int i = 0; i < is.getItemMeta().getLore().size(); i++) {
if (ChatColor.stripColor(is.getItemMeta().getLore().get(i).toLowerCase())
.contains(ChatColor.stripColor("movement"))) {
String part = ChatColor.stripColor(is.getItemMeta().getLore().get(i));
type = SnowflakeUtil
.capitalize(part.replaceAll("Movement:", "").replaceAll("\\s", ""));
}
}
}
}
}
}
jumpers.add(p);
switch (type) {
case "Rocketjump":
p.setVelocity(p.getLocation().getDirection().multiply(1));
p.setVelocity(new Vector(p.getVelocity().getX(), 0.75D, p.getVelocity().getZ()));
break;
}
}
}
}
Я не совсем уверен, что вы пытаетесь сказать мне ... setCancelled (ложь), не имеет никакого смысла, и это событие должно работать нормально, когда игрок * не * в списке – AscendedKitten
Ваш код не компилируется, 'event.getCause' не возвращает логическое значение, а' EntityDamageEvent.DamageCause' – Ferrybig
Вот что я тоже подумал. if (e.getCause(). равно (DamageCause.FALL)) должен быть правильным синтаксисом в этом случае – AscendedKitten