Personal Dimension Portal
基本信息
| 属性 | 值 |
|---|---|
| 注册名(主方块) | personalspace:personalPortal |
| 注册名(迁移方块) | personalspace:personalPortal_migration2 / _migration3 / _migration4 |
| TileEntity | me.eigenraven.personalspace.block.PortalTileEntity |
| 旧 TE 别名 | uw_portal_te(从 UtilityWorlds 迁移) |
| 实体方块 ID | PortalItem (id=1) |
| 硬度 | 25.0 |
| 爆炸抗性 | 6,000,000 |
| 碰撞箱 | 0,0,0 → 1, 0.75, 1(半高方块) |
| 光照不透明度 | 0 |
| 材质 | Material.rock |
| 透光/不透明 | 渲染为非正常方块;isOpaqueCube()=false |
| 创造标签 | 主方块在 tabTransport;3 个迁移方块不在创造栏 |
| 贴图 | 顶面 = 下界传送门;底面 = 附魔台;侧面 = 黑曜石 |
构造
PortalBlock 通过 isMigration 布尔构造两种行为:
- 主方块(
personalSpacePortal):在创造栏中,可放置,使用BLOCK_PORTAL字段。 - 迁移方块(
personalSpacePortalLegacy):3 个变体BP_MIGRATION_2/3/4,分别在missingMapping(见下文)阶段重映射为旧utilityworlds:uw_portal_void/mining/garden/return。
功能
每个个人维度对应 2 个放置的 portal:
- 原生(home)portal:放置在维度内,默认目标指向主世界 (dim 0)。
- 返回(return)portal:通过放置主方块并指向 home portal 自动生成或被 link。
PortalTileEntity 字段(持久化到 NBT 中):
| 字段 | 含义 |
|---|---|
active |
portal 是否可用 |
targetDimId |
目标维度 ID(0=主世界) |
targetPosX/Y/Z |
目标维度内的 portal 坐标 |
targetFacing |
目标 portal 朝向(用于计算玩家朝向) |
facing |
当前 portal 朝向(ForgeDirection) |
放置时根据玩家位置自动决定朝向:
|dx| > |dz|→ 朝东(dx>0)或朝西(dx<0)- 否则 → 朝南(dz>0)或朝北(dz<0)
摆放要求
- 必须为半高方块(高度 0.75)。
- 在 5×5×5 范围内不允许存在其他 portal(
PortalItem.onItemUse强制距离检查,违者显示chat.personalWorld.proximity)。 - 放置时若手持的
ItemStack含 NBT,会复制 NBT 到 TileEntity 并自动调用linkOtherPortal(false, placer)。
交互
| 触发 | 行为 |
|---|---|
| 左键(远程) | 显示 chat.overworldPersonalDimension 阻止离主世界过远时修改 |
| 右键(未激活或在主世界 + Shift) | 打开 GuiEditWorld,让玩家配置维度设置 |
| 右键(已激活、不在 Shift 状态、玩家为 EntityPlayerMP) | transport():执行 transferPlayerToDimension,由 PersonalTeleporter 传送 |
客户端 onDataPacket |
PortalTileEntity 收到服务端描述包后关闭打开的 GUI(保证两端的视图同步) |
掉落
getDrops:永远返回 1 个ItemStack(主方块物品),NBT 携带完整active/target/facing/targetFacing。getPickBlock:同getDrops。removedByPlayer:玩家挖方块时也调用dropBlockAsItem。- 方块物品本身(
PortalItem):getEntityLifespan = Integer.MAX_VALUE(地上不会消失)hasCustomEntity = true,使用PortalEntityItem替换默认实体;该实体除虚空伤害外对所有DamageSource免疫(包括火、岩浆、仙人掌、爆炸)。
关联
- 主类:
PersonalSpaceMod— 注册 4 个PortalBlock实例 +PortalTileEntity(含uw_portal_te别名)+PortalEntityItem实体。 - NBT 写入键:
active,target[](4 项),facing,targetFacing。 - 老格式字段(自动迁移):
isReturnPortal,remoteDimensionId,remotePos[],remoteDir(byte)。 - 启动
FMLMissingMappingsEvent时将 4 个旧utilityworlds:uw_portal_*重映射为 4 个personalspace:personalPortal*。