Помогите Запрет взрыва определенного блока [Решено]

Статус
Закрыто для дальнейших ответов.

rapitor3

Активный участник
Баллы
61
Здравствуйте! Стоит цель запретить взрыв сундуков и печек. Пытался реализовать с BlockExplodeEvent и BlockBreakEvent, но по итогу всё равно выпадает. Помогите пжлст, сроки горят, с друзяшками играть хочется ;)
Вот попытки моей реализаций:

@EventHandler
public void explode(BlockExplodeEvent e){
Block block = e.getBlock();
Material material = block.getType();
if (material == CHEST) {
e.isCancelled();
e.setCancelled(true);
}
}

и

@EventHandler
public void explode(BlockBreakEvent e){
if (e.getBlock().getType() == CHEST) {
e.isCancelled();
e.setCancelled(true);
}
}
 
Эти два ивента можно и не использовать. Всё довольно просто - EntityExplodeEvent.
@EventHandler
public void explode(EntityExplodeEvent e){
for(Block b : e.blockList()){
if(b.getType() == Material.CHEST || b.getType() == Material.FURNACE) {
e.blockList().remove(b);
}
}
}
 
Спасибо, вроде работает. Только в консоли ругается что-то.


[23:19:08] [Server thread/ERROR]: Could not pass event EntityExplodeEvent to control v1.0 SNAPSHOT
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:320) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:529) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:514) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.Explosion.a(Explosion.java:247) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.World.createExplosion(World.java:854) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.WorldServer.createExplosion(WorldServer.java:1294) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.World.createExplosion(World.java:843) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.EntityTNTPrimed.explode(EntityTNTPrimed.java:88) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.EntityTNTPrimed.tick(EntityTNTPrimed.java:67) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.WorldServer.entityJoinedWorld(WorldServer.java:626) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.World.a(World.java:718) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.WorldServer.doTick(WorldServer.java:395) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.MinecraftServer.b(MinecraftServer.java:1082) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.DedicatedServer.b(DedicatedServer.java:399) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.MinecraftServer.a(MinecraftServer.java:984) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:824) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_221]
Caused by: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source) ~[?:1.8.0_221]
at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_221]
at com.rapitor3.Handler.explode(Handler.java:74) ~[?:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_221]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_221]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_221]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_221]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:316) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29][/QUOTE]
 
Эти два ивента можно и не использовать. Всё довольно просто - EntityExplodeEvent.
@EventHandler
public void explode(EntityExplodeEvent e){
for(Block b : e.blockList()){
if(b.getType() == Material.CHEST || b.getType() == Material.FURNACE) {
e.blockList().remove(b);
}
}
}
Прикольна, ты не сможешь удалить из листа элемент, который итерируешь... Будет ConcurrentModificationException
 
Вот так точно можно.
Код:
    @EventHandler
    public void on(EntityExplodeEvent e) {
        e.blockList().removeIf(block -> block.getType().equals(Material.CHEST) || block.getType().equals(Material.FURNACE));
    }
 
Спасибо друг, работает без нареканий, прям как я хотел ;)

Вот так точно можно.
Код:
    @EventHandler
    public void on(EntityExplodeEvent e) {
        e.blockList().removeIf(block -> block.getType().equals(Material.CHEST) || block.getType().equals(Material.FURNACE));
    }

Объявляю тему закрытой!
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх