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)。
相关条目
- ProtectionHandlers - Forge 事件挂接点
- Segment - 区域判定单元
- Protection - 保护规则的数据载体
- FlagType - 15 种 flag