修复了床/重生锚爆炸可对领地造成破坏的漏洞 #4

This commit is contained in:
zhangyuheng 2024-08-27 10:18:49 +08:00
parent 0b15d34bdd
commit aa9065eafe
6 changed files with 67 additions and 11 deletions

View File

@ -4,7 +4,7 @@ plugins {
}
group = "cn.lunadeer"
version = "2.3.7-beta"
version = "2.3.8-beta"
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21))

View File

@ -13,7 +13,7 @@ import java.util.Comparator;
import java.util.List;
public enum Flag {
ANCHOR("anchor", "重生锚", "是否允许设置重生锚", false, false, true),
ANCHOR("anchor", "重生锚", "是否允许设置/使用重生锚", false, false, true),
ANIMAL_KILLING("animal_killing", "对动物造成伤害", "是否允许对动物造成伤害", false, false, true),
ANIMAL_SPAWN("animal_spawn", "动物生成(繁殖)", "是否允许动物生成(包括繁殖)", true, true, false),
ANVIL("anvil", "使用铁砧", "是否允许使用铁砧", false, false, true),
@ -26,7 +26,7 @@ public enum Flag {
CONTAINER("container", "一般容器", "包含:箱子/木桶/潜影盒/盔甲架/展示框", false, false, true),
CRAFT("craft", "使用工作台", "是否可以使用工作台", false, false, true),
CRAFTER("crafter", "合成器", "是否可以修改自动合成器", false, false, true),
CREEPER_EXPLODE("creeper_explode", "生物破坏", "包含:苦力怕/凋零头颅/末影水晶/火球爆炸等", false, true, true),
CREEPER_EXPLODE("creeper_explode", "生物破坏/非TNT爆炸", "包含:苦力怕/凋零头颅/末影水晶/火球/床/重生锚爆炸等", false, true, true),
COMPARER("comparer", "比较器交互", "是否可以修改比较器状态", false, false, true),
DOOR("door", "门交互", "是否可以使用各种材质的门(包括活板门)", false, false, true),
DRAGON_BREAK_BLOCK("dragon_break_block", "末影龙破坏方块", "末影龙冲撞是否可以破坏方块", false, true, true),

View File

@ -8,14 +8,12 @@ import org.bukkit.Location;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.*;
import org.bukkit.event.entity.*;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingBreakEvent;
@ -43,6 +41,18 @@ public class EnvironmentEvents implements Listener {
});
}
@EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - bed anchor
public void onBedAnchorExplosion(BlockExplodeEvent event) {
BlockState block = event.getExplodedBlockState();
if (block == null) {
return;
}
event.blockList().removeIf(blockState -> {
DominionDTO dom = Cache.instance.getDominionByLoc(blockState.getLocation());
return !checkFlag(dom, Flag.CREEPER_EXPLODE, null);
});
}
@EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - item frame
public void onItemFrameExploded(HangingBreakByEntityEvent event) {
Entity entity = event.getEntity();

View File

@ -63,6 +63,24 @@ public class PlayerEvents implements Listener {
}
}
@EventHandler(priority = EventPriority.HIGHEST) // anchor
public void onAnchorInteractive(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = block.getType();
if (clicked != Material.RESPAWN_ANCHOR) {
return;
}
Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getDominionByLoc(block.getLocation());
checkFlag(dom, Flag.ANCHOR, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // animal_killing
public void onAnimalKilling(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player bukkitPlayer)) {

View File

@ -8,14 +8,12 @@ import org.bukkit.Location;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.*;
import org.bukkit.event.entity.*;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingBreakEvent;
@ -43,6 +41,18 @@ public class EnvironmentEvents implements Listener {
});
}
@EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - bed anchor
public void onBedAnchorExplosion(BlockExplodeEvent event) {
BlockState block = event.getExplodedBlockState();
if (block == null) {
return;
}
event.blockList().removeIf(blockState -> {
DominionDTO dom = Cache.instance.getDominionByLoc(blockState.getLocation());
return !checkFlag(dom, Flag.CREEPER_EXPLODE, null);
});
}
@EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - item frame
public void onItemFrameExploded(HangingBreakByEntityEvent event) {
Entity entity = event.getEntity();

View File

@ -63,6 +63,24 @@ public class PlayerEvents implements Listener {
}
}
@EventHandler(priority = EventPriority.HIGHEST) // anchor
public void onAnchorInteractive(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = block.getType();
if (clicked != Material.RESPAWN_ANCHOR) {
return;
}
Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getDominionByLoc(block.getLocation());
checkFlag(dom, Flag.ANCHOR, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // animal_killing
public void onAnimalKilling(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player bukkitPlayer)) {