领地环境设置新增“允许外部重力方块落入”权限 #18

如果禁止则领地外的重力方块进入领地触地时会变为掉落物,该权限默认为禁止
This commit is contained in:
ZhangYuheng 2024-09-19 14:22:13 +08:00
parent 3a08f41906
commit 99405c3828
5 changed files with 101 additions and 31 deletions

View File

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

View File

@ -44,6 +44,7 @@ public enum Flag {
FLOW_IN_PROTECTION("flow_in_protection", "外部流体是否可以进入", "包含:岩浆、水(不会阻止领地内部的流体蔓延)", false, true, true),
FLY("fly", "飞行", "不是翅鞘飞行,是类似于创造模式的飞行", false, false, false),
GLOW("glow", "玩家发光", "类似光灵箭的高亮效果", false, false, true),
GRAVITY_BLOCK("gravity_block", "允许外部重力方块落入", "如果禁止则领地外重力方块进入领地会变为掉落物", false, true, true),
HARVEST("harvest", "收获", "收获庄稼、作物", false, false, true),
HONEY("honey", "蜂巢交互", "是否可以采蜂蜜", false, false, true),
HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true),

View File

@ -4,7 +4,8 @@ Commands:
CreateDominionUsage: '用法: /dominion create <领地名称>'
CreateSelectPointsFirst: 请先使用工具选择领地的对角线两点,或使用 /dominion auto_create <领地名称> 创建自动领地
CreateSubDominionUsage: '用法: /dominion create_sub <子领地名称> [父领地名称]'
CreateSubSelectPointsFirst: 请先使用工具选择子领地的对角线两点,或使用 /dominion auto_create_sub <子领地名称> [父领地名称] 创建自动子领地
CreateSubSelectPointsFirst: 请先使用工具选择子领地的对角线两点,或使用 /dominion auto_create_sub <子领地名称>
[父领地名称] 创建自动子领地
AutoCreateDominionUsage: '用法: /dominion auto_create <领地名称>'
AutoCreateSubDominionUsage: '用法: /dominion auto_create_sub <子领地名称> [父领地名称]'
AutoCreateDominionDisabled: 自动创建领地功能已关闭
@ -34,7 +35,8 @@ Commands:
DominionAddMemberUsage: '用法: /dominion member add <领地名称> <玩家名称>'
DominionSetFlagUsage: '用法: /dominion member set_flag <领地名称> <玩家名称> <权限名称> <true/false>'
DominionRemoveMemberUsage: '用法: /dominion member remove <领地名称> <玩家名称>'
DominionApplyTemplateUsage: '用法: /dominion member apply_template <领地名称> <玩家名称> <模板名称>'
DominionApplyTemplateUsage: '用法: /dominion member apply_template <领地名称> <玩家名称>
<模板名称>'
MemberUsage: '用法: /dominion member <add/set_flag/remove/apply_template/list/setting/select_player/select_template>'
PageOptional: 页码(可选)
ArgumentsNotEnough: 参数不足
@ -247,10 +249,10 @@ Messages:
PluginVersion: 版本:%s
PlaceholderAPIRegisterSuccess: 成功注册 PlaceholderAPI 扩展
LoadedGroupAmount: 共加载了 %d 个领地组
MapInfoDetail: <div>%s</div><div>所有人:%s</div>
AutoCleanStart: 开始自动清理长时间未登录玩家领地数据
AutoCleanPlayer: 已清理玩家 %s 的领地数据
AutoCleanEnd: 自动清理完成
MapInfoDetail: <div>%s</div><div>所有人:%s</div>
TUI:
NotDominionOwnerOrAdminForPage: 你不是领地 %s 的拥有者或管理员,无权访问此页面
CommandHelp:
@ -423,32 +425,26 @@ CUI:
Config:
Check:
AutoCreateRadiusError: AutoCreateRadius 不能等于 0已重置为 10
MessageDisplayError: MessageDisplay 不能设置为 %s已重置为 ACTION_BAR
AutoCleanAfterDaysError: AutoCleanAfterDays 不能等于 0已重置为 180
ToolNameError: 工具名称设置错误,已重置为 ARROW
LimitSizeXError: Limit.SizeX 尺寸不能小于 4已重置为 128
LimitSizeYError: Limit.SizeY 尺寸不能小于 4已重置为 64
LimitSizeZError: Limit.SizeZ 尺寸不能小于 4已重置为 128
LimitMinYError: Limit.MinY 不能大于或等于 Limit.MaxY已重置为 -64 320
RefundError: Economy.Refund 设置不合法,已重置为 0.85
PriceError: Economy.Price 设置不合法,已重置为 10.0
LimitSizeYAutoAdjust: 启用 Limit.Vert 时 Limit.SizeY 不能小于 Limit.MaxY - Limit.MinY已自动调整为 %d
AmountError: Limit.Amount 设置不合法,已重置为 10
DepthError: Limit.Depth 设置不合法,已重置为 3
GroupMinYError: 权限组 %s 的 MinY 不能大于等于 MaxY已重置为 -64 和 320
GroupSizeXError: 权限组 %s 的 SizeX 设置过小,已重置为 128
GroupSizeYError: 权限组 %s 的 SizeY 设置过小,已重置为 64
GroupSizeZError: 权限组 %s 的 SizeZ 设置过小,已重置为 128
GroupAmountError: 权限组 %s 的 Amount 设置不合法,已重置为 10
GroupDepthError: 权限组 %s 的 Depth 设置不合法,已重置为 3
GroupPriceError: 权限组 %s 的 Price 设置不合法,已重置为 10.0
GroupRefundError: 权限组 %s 的 Refund 设置不合法,已重置为 0.85
GroupMinYError: '%s 的 MinY 不能大于等于 MaxY已重置为 -64 和 320'
GroupSizeXError: '%s 的 SizeX 设置过小,已重置为 128'
GroupSizeYError: '%s 的 SizeY 设置过小,已重置为 64'
GroupSizeZError: '%s 的 SizeZ 设置过小,已重置为 128'
GroupAmountError: '%s 的 Amount 设置不合法,已重置为 10'
GroupDepthError: '%s 的 Depth 设置不合法,已重置为 3'
GroupPriceError: '%s 的 Price 设置不合法,已重置为 10.0'
GroupRefundError: '%s 的 Refund 设置不合法,已重置为 0.85'
LoadFlagError: 读取权限配置失败:%s
TpDelayError: 传送延迟不能小于 0已重置为 0
TpCoolDownError: 传送冷却不能小于 0已重置为 0
MessageDisplayError: MessageDisplay 不能设置为 %s已重置为 ACTION_BAR
Comment:
Language: 语言设置,参考 languages 文件夹下的文件名
AutoCreateRadius: 自动创建领地的半径,单位为方块
MessageDisplay: 提示消息显示位置BOSS_BAR, ACTION_BAR, TITLE, SUBTITLE, CHAT
MessageDisplayNoPermission: 玩家没有权限时的提示消息位置
MessageDisplayJoinLeave: 进入/离开领地时的提示消息位置
NegativeOneDisabled: -1表示不开启
DefaultLimit: 默认玩家圈地限制
SpawnProtectRadius: 出生点保护半径 出生点此范围内不允许圈地
@ -462,8 +458,8 @@ Config:
Depth: 子领地深度
ZeroDisabled: 0表示不开启
Vert: 是否自动延伸到 MaxY 和 MinY
DisabledWorlds: 不允许圈地的世界列表
OpBypass: 是否允许OP无视领地限制
WorldSettings: 单独设置某个世界的圈地规则(如不设置则使用以上规则)
TpDelay: 传送延迟 秒
TpCoolDown: 传送冷却 秒
AutoCleanAfterDays: 自动清理长时间未上线玩家的领地(天)
@ -487,10 +483,6 @@ Config:
GroupLine6: 一些特殊优惠,例如更少的圈地价格、更大的领地等,你可以在
GroupLine7: 这里配置。详细说明参阅以下链接:
GroupLine8DocumentAddress: '> https://dominion.lunadeer.cn/%s/operator/privilege.html'
WorldSettings: 单独设置某个世界的圈地规则(如不设置则使用以上规则)
MessageDisplay: 领地提示消息显示位置BOSS_BAR, ACTION_BAR, TITLE, SUBTITLE, CHAT
MessageDisplayNoPermission: 玩家没有权限时的提示消息位置
MessageDisplayJoinLeave: 进入/离开领地时的提示消息位置
Flags:
admin:
DisplayName: 管理员
@ -585,6 +577,9 @@ Flags:
glow:
DisplayName: 玩家发光
Description: 类似光灵箭的高亮效果
gravity_block:
DisplayName: 允许外部重力方块落入
Description: 如果禁止则领地外重力方块进入领地会变为掉落物
harvest:
DisplayName: 收获
Description: 收获庄稼、作物

View File

@ -20,8 +20,11 @@ import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import static cn.lunadeer.dominion.utils.EventUtils.checkFlag;
import static org.bukkit.Material.FARMLAND;
@ -333,7 +336,7 @@ public class EnvironmentEvents implements Listener {
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onHopper(InventoryMoveItemEvent event) {
public void onHopper(InventoryMoveItemEvent event) { // hopper_outside
Inventory hopper = event.getDestination();
Inventory inventory = event.getSource();
DominionDTO hopperDom = Cache.instance.getDominionByLoc(hopper.getLocation());
@ -349,7 +352,7 @@ public class EnvironmentEvents implements Listener {
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockPushedByPiston(BlockPistonExtendEvent event) {
public void onBlockPushedByPiston(BlockPistonExtendEvent event) { // piston_outside
Block piston = event.getBlock();
DominionDTO pistonDom = Cache.instance.getDominionByLoc(piston.getLocation());
BlockFace direction = event.getDirection();
@ -369,4 +372,38 @@ public class EnvironmentEvents implements Listener {
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onGravityBlockFalling(EntityChangeBlockEvent event) { // gravity_block
Entity entity = event.getEntity();
if (!(entity instanceof FallingBlock)) {
return;
}
Block block = event.getBlock();
if (event.getTo().isAir()) {
fallingBlockMap.put(entity.getUniqueId(), block.getLocation());
} else {
Location locStart = fallingBlockMap.get(entity.getUniqueId());
if (locStart == null) {
return;
}
fallingBlockMap.remove(entity.getUniqueId());
Location locEnd = block.getLocation();
DominionDTO domStart = Cache.instance.getDominionByLoc(locStart);
DominionDTO domEnd = Cache.instance.getDominionByLoc(locEnd);
if (domEnd == null) {
return;
}
if (domStart != null && domStart.getId().equals(domEnd.getId())) {
return;
}
if (!checkFlag(domEnd, Flag.GRAVITY_BLOCK, null)) {
event.setCancelled(true);
locEnd.getWorld().dropItemNaturally(locEnd, new ItemStack(((FallingBlock) entity).getBlockData().getMaterial()));
entity.remove();
}
}
}
private static final Map<UUID, Location> fallingBlockMap = new java.util.HashMap<>();
}

View File

@ -19,8 +19,11 @@ import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import static cn.lunadeer.dominion.utils.EventUtils.checkFlag;
import static org.bukkit.Material.FARMLAND;
@ -329,7 +332,7 @@ public class EnvironmentEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void onHopper(InventoryMoveItemEvent event) {
public void onHopper(InventoryMoveItemEvent event) { // hopper_outside
Inventory hopper = event.getDestination();
Inventory inventory = event.getSource();
DominionDTO hopperDom = Cache.instance.getDominionByLoc(hopper.getLocation());
@ -345,7 +348,7 @@ public class EnvironmentEvents implements Listener {
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockPushedByPiston(BlockPistonExtendEvent event) {
public void onBlockPushedByPiston(BlockPistonExtendEvent event) { // piston_outside
Block piston = event.getBlock();
DominionDTO pistonDom = Cache.instance.getDominionByLoc(piston.getLocation());
BlockFace direction = event.getDirection();
@ -365,4 +368,38 @@ public class EnvironmentEvents implements Listener {
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onGravityBlockFalling(EntityChangeBlockEvent event) { // gravity_block
Entity entity = event.getEntity();
if (!(entity instanceof FallingBlock)) {
return;
}
Block block = event.getBlock();
if (event.getTo().isAir()) {
fallingBlockMap.put(entity.getUniqueId(), block.getLocation());
} else {
Location locStart = fallingBlockMap.get(entity.getUniqueId());
if (locStart == null) {
return;
}
fallingBlockMap.remove(entity.getUniqueId());
Location locEnd = block.getLocation();
DominionDTO domStart = Cache.instance.getDominionByLoc(locStart);
DominionDTO domEnd = Cache.instance.getDominionByLoc(locEnd);
if (domEnd == null) {
return;
}
if (domStart != null && domStart.getId().equals(domEnd.getId())) {
return;
}
if (!checkFlag(domEnd, Flag.GRAVITY_BLOCK, null)) {
event.setCancelled(true);
locEnd.getWorld().dropItemNaturally(locEnd, new ItemStack(((FallingBlock) entity).getBlockData().getMaterial()));
entity.remove();
}
}
}
private static final Map<UUID, Location> fallingBlockMap = new java.util.HashMap<>();
}