ProtectionManager

基本信息

属性 值
类名 mytown.protection.ProtectionManager
文件 src/main/java/mytown/protection/ProtectionManager.java
行数 477
类型 纯静态类,私有构造
启用版本 Minecraft 1.7.10

功能

保护判定的总入口。MyTown2 没有方块,因此它的全部玩法都落在这一个类上: 所有破坏、交互、使用、传送、PVP 判定都经由这里,再下沉到 Segment 做区域与 flag 匹配。

六类 Segment 容器

ProtectionManager 持有 6 个静态 Segment.Container,按判定对象分类:

字段 泛型 用途
segmentsBlock SegmentBlock 普通方块
segmentsSpecialBlock SegmentSpecialBlock 特殊方块(走 getter 取影响范围)
segmentsTrackedEntity SegmentEntity 需跟踪移动的实体
segmentsEntity SegmentEntity 一般实体
segmentsItem SegmentItem 掉落物 / 物品
segmentsTile SegmentTileEntity TileEntity

另有私有 Map<EntityPlayer, EntityPos> lastTickPlayerPos,记录玩家上一 tick 位置, 用于移动触发的 check(EntityPlayerMP)。

关键方法(节选)

方法 用途
addProtection(Protection) 注册一处保护
check(EntityPlayerMP) 玩家每 tick 移动检查
checkExist(Entity, boolean spawn) 实体能否存在 / 能否在此生成
checkImpact(Entity, Resident, MovingObjectPosition, Event) 实体撞击
check(TileEntity) TileEntity 交互
checkInteraction(...) / checkPVP(...) 交互 / PVP
checkUsage(ItemStack, Resident, Action, BlockPos, ...) 物品使用
checkBreakWithItem(...) / checkBlockInteraction(...) 破坏 / 方块交互
checkBlockBreak(Block) 方块能否被破坏
checkWarpLevel(Resident, dim, x, y, z) 传送权限(MAXWARP flag)
hasPermission(...) flag 判定,两个重载(BlockPos 与 Volume)
getFlagValueAtLocation(FlagType, dim, x, y, z) 读取该坐标的 flag 值
getOwner(Entity) 取实体所有者

实现要点

  • 所有坐标参数都带 dim(世界维度 ID),内部转 MinecraftServer.getServer().worldServerForDimension(dim) 取世界。 ⚠️ 这是维度 ID,不是 DimensionType,本 mod 不注册任何维度。
  • 维度切换有专门处理:checkLocationOnDimensionChanged(...)(ProtectionManager.java:144), 避免玩家换维度后保护判定用错世界。
  • serverStopping 时 Mod 入口 会调 ProtectionManager.saveBlockOwnersToDB(),与 MyTownDatasource 的 deleteAllBlockOwners() 配对。
  • 判定依赖 Config.instance.fireSpreadInTowns / taintSpreadInTowns / mobTravelInTowns 三个保护开关(均默认 false)。

相关条目