修复了展示框放置、破坏权限漏洞
Java CI-CD with Maven / build (push) Successful in 32m53s Details

This commit is contained in:
zhangyuheng 2024-04-22 10:27:27 +08:00
parent 07fe7de6ba
commit 36466f155f
2 changed files with 64 additions and 12 deletions

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId> <groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId> <artifactId>Dominion</artifactId>
<version>1.19.0-beta</version> <version>1.19.1-beta</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Dominion</name> <name>Dominion</name>

View File

@ -8,6 +8,7 @@ import cn.lunadeer.dominion.utils.Notification;
import io.papermc.paper.event.entity.EntityDyeEvent; import io.papermc.paper.event.entity.EntityDyeEvent;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.*; import org.bukkit.entity.*;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -19,13 +20,19 @@ import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityPlaceEvent; import org.bukkit.event.entity.EntityPlaceEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingPlaceEvent;
import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.*; import org.bukkit.event.player.*;
import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.event.vehicle.VehicleDestroyEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataType;
import org.spigotmc.event.entity.EntityMountEvent; import org.spigotmc.event.entity.EntityMountEvent;
import java.util.Objects;
import static cn.lunadeer.dominion.events.Apis.getInvDominion; import static cn.lunadeer.dominion.events.Apis.getInvDominion;
public class PlayerEvents implements Listener { public class PlayerEvents implements Listener {
@ -223,25 +230,50 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // break @EventHandler(priority = EventPriority.HIGHEST) // break
public void onBlockBreak(BlockBreakEvent event) { public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getDominion(event.getBlock().getLocation()); if (onBreak(player, event.getBlock().getLocation())) {
if (dom == null) {
return; return;
} }
if (Apis.hasPermission(player, dom)) { event.setCancelled(true);
}
@EventHandler(priority = EventPriority.HIGHEST) // break - item frame
public void onItemFrameBreak(HangingBreakByEntityEvent event) {
Entity entity = event.getEntity();
if (!(entity instanceof ItemFrame)) {
return; return;
} }
ItemFrame itemFrame = (ItemFrame) entity;
Entity remover = event.getRemover();
if (!(remover instanceof Player)) {
return;
}
if (onBreak((Player) event.getRemover(), itemFrame.getLocation())) {
return;
}
itemFrame.remove();
event.setCancelled(true);
}
public static boolean onBreak(Player player, Location location) {
DominionDTO dom = Cache.instance.getDominion(location);
if (dom == null) {
return true;
}
if (Apis.hasPermission(player, dom)) {
return true;
}
PlayerPrivilegeDTO privilege = Cache.instance.getPlayerPrivilege(player, dom); PlayerPrivilegeDTO privilege = Cache.instance.getPlayerPrivilege(player, dom);
if (privilege != null) { if (privilege != null) {
if (privilege.getBreak()) { if (privilege.getBreak()) {
return; return true;
} }
} else { } else {
if (dom.getBreak()) { if (dom.getBreak()) {
return; return true;
} }
} }
Notification.error(player, "你没有破坏方块的权限"); Notification.error(player, "你没有破坏方块的权限");
event.setCancelled(true); return false;
} }
@EventHandler(priority = EventPriority.HIGHEST) // button @EventHandler(priority = EventPriority.HIGHEST) // button
@ -933,17 +965,31 @@ public class PlayerEvents implements Listener {
if (onPlace(player, event.getBlock().getLocation())) { if (onPlace(player, event.getBlock().getLocation())) {
return; return;
} }
Notification.error(player, "你没有放置方块的权限");
event.setCancelled(true); event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST) // place - lava or water
public void onPlaceLavaOrWater(PlayerBucketEmptyEvent event) { public void onPlaceLavaOrWater(PlayerBucketEmptyEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
if (onPlace(player, event.getBlock().getLocation())) { if (onPlace(player, event.getBlock().getLocation())) {
return; return;
} }
Notification.error(player, "你没有放置方块的权限"); event.setCancelled(true);
}
@EventHandler(priority = EventPriority.HIGHEST) // place - item frame
public void placeItemFrame(HangingPlaceEvent event) {
Entity entity = event.getEntity();
if (entity.getType() != EntityType.ITEM_FRAME && entity.getType() != EntityType.GLOW_ITEM_FRAME) {
return;
}
Player player = event.getPlayer();
if (player == null) {
return;
}
if (onPlace(player, entity.getLocation())) {
return;
}
event.setCancelled(true); event.setCancelled(true);
} }
@ -957,10 +1003,16 @@ public class PlayerEvents implements Listener {
} }
PlayerPrivilegeDTO privilege = Cache.instance.getPlayerPrivilege(player, dom); PlayerPrivilegeDTO privilege = Cache.instance.getPlayerPrivilege(player, dom);
if (privilege != null) { if (privilege != null) {
return privilege.getPlace(); if (privilege.getPlace()) {
return true;
}
} else { } else {
return dom.getPlace(); if (dom.getPlace()) {
return true;
}
} }
Notification.error(player, "你没有放置方块的权限");
return false;
} }
@EventHandler(priority = EventPriority.HIGHEST) // pressure @EventHandler(priority = EventPriority.HIGHEST) // pressure