陷阱(Traps)
Tinkers’ Construct 用来守家的 5 个方块:1 个竹刺 + 4 个木栅栏。全部在 world/TinkerWorld.java:161-165 构造、:256-260 注册。
基本信息
| 属性 | 值 |
|---|---|
| 模组 | tconstruct |
| 注册名 | trap.punji、trap.barricade.oak、trap.barricade.spruce、trap.barricade.birch、trap.barricade.jungle |
| 公共基类 | mantle.blocks.MantleBlock(非普通方块,走自定义渲染) |
| 注册代码 | world/TinkerWorld.java:256-260 |
| 方块数 | 5 |
| TileEntity | 无(5 个都是纯逻辑方块) |
Punji(竹刺)
| 属性 | 值 | 来源 |
|---|---|---|
| 类 | tconstruct.blocks.traps.Punji extends MantleBlock |
blocks/traps/Punji.java:23 |
| 材质 | Material.plants |
Punji.java:26 |
| 硬度 | 3.0 | Punji.java:32 |
| 碰撞盒 | (0.125, 0, 0.125) – (0.875, 0.375, 0.875) |
Punji.java:27 |
| 脚步声 | Block.soundTypeGrass |
Punji.java:28 |
| 标签 | TConstructRegistry.blockTab |
Punji.java:31 |
| 渲染 | getRenderType() = PunjiRender.model |
tconstruct/world/model/PunjiRender.java |
伤害公式(Punji.onEntityCollidedWithBlock)
int damage = world.getBlockMetadata(x, y, z) / 2 + 1; // 基础
if (entity.fallDistance > 0) damage += fallDistance * 1.5 + 2; // 摔落加成
entity.attackEntityFrom(DamageSource.cactus, damage);
((EntityLivingBase) entity).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 1));
| 部件 | 值 |
|---|---|
| 触发条件 | entity instanceof EntityLivingBase |
| 基础伤害 | metadata / 2 + 1 ⇒ metadata 0/1 = 1,2/3 = 2,4/5 = 3,6/7 = 4 |
| 摔落加成 | fallDistance × 1.5 + 2(仅当 fallDistance > 0) |
| 伤害源 | DamageSource.cactus |
| 附赠 | 缓慢 20 tick、等级 1(Potion.moveSlowdown) |
metadata 4 级加固(Punji.onBlockActivated)
右键竹刺,手里拿的也是竹刺,就把 metadata +1(上限 4,即 meta < 4 才加):
if (stack.getItem() == Item.getItemFromBlock(TinkerWorld.punji)) {
world.setBlockMetadataWithNotify(x, y, z, meta + 1, 3);
world.playSoundEffect(...); // 音量 (stepSound.getVolume()+1)/2,音高 stepSound.getPitch()*0.8
player.swingItem();
if (!player.capabilities.isCreativeMode) { stack.stackSize--; if (stack.stackSize <= 0) player.destroyCurrentEquippedItem(); }
}
⇒ 成品配方出 5 个,每右击一次 +1 伤害,最多 4 级。创造模式不消耗。
掉落(Punji.quantityDropped)
public int quantityDropped(int meta, int fortune, Random random) { return meta + 1; }
⇒ 打掉几级的竹刺就掉几个,1 级掉 1 个,4 级掉 4 个。fortune 与 random 参数未使用。
BarricadeBlock(木栅栏 ×4)
一个类、四个实例,差异只有贴图——构造函数 (Block model, int meta),用 model.getIcon(2, modelMeta) 取贴图:
| 注册名 | 构造参数 | 贴图来源 |
|---|---|---|
trap.barricade.oak |
new BarricadeBlock(Blocks.log, 0) |
原版橡木原木侧面 |
trap.barricade.spruce |
new BarricadeBlock(Blocks.log, 1) |
云杉原木侧面 |
trap.barricade.birch |
new BarricadeBlock(Blocks.log, 2) |
白桦原木侧面 |
trap.barricade.jungle |
new BarricadeBlock(Blocks.log, 3) |
丛林原木侧面 |
| 属性 | 值 | 来源 |
|---|---|---|
| 类 | tconstruct.blocks.traps.BarricadeBlock extends MantleBlock |
blocks/traps/BarricadeBlock.java:22 |
| 材质 | Material.wood |
BarricadeBlock.java:27 |
| 硬度 | 4.0 | BarricadeBlock.java:29 |
| 标签 | TConstructRegistry.blockTab |
BarricadeBlock.java:30 |
isOpaqueCube() |
false | BarricadeBlock.java:77 |
renderAsNormalBlock() |
false | BarricadeBlock.java:83 |
getRenderType() |
BarricadeRender.model |
BarricadeBlock.java:88 |
registerBlockIcons |
空实现 | BarricadeBlock.java:45 |
| 碰撞盒 | 整格(getCollisionBoundingBoxFromPool 返回 x..x+1) |
BarricadeBlock.java:59-62 |
| ItemBlock | tconstruct.world.itemblocks.BarricadeItem(4 个共用) |
TinkerWorld.java:257-260 |
栅栏也有 4 级 metadata
BarricadeBlock.onBlockActivated(:77-100):手里拿栅栏且未潜行时,若 meta % 4 != 3 就 meta + 1(封顶 meta % 4 == 3),并消耗 1 个(创造模式不消耗)。
harvestBlock(:67-72)则反向降级后再掉落:
if (meta % 4 > 0) world.setBlock(x, y, z, this, meta - 1, 3);
dropBlockAsItem(world, x, y, z, new ItemStack(this));
⇒ 用镐采集 3 级栅栏:先把它退回 2 级(留在世界里),再掉 1 个栅栏。这与竹刺的 meta + 1 掉落不同——竹刺是掉了就掉 meta+1 个,栅栏是留下一个降级的方块 + 掉 1 个物品。
合成配方
全部在 world/TinkerWorld.java:752-780:
| 产物 | 数量 | 形状 | 材料 |
|---|---|---|---|
trap.punji |
5 | b b / ␣b␣ / b b(对角 5 根芦苇) |
Items.reeds |
trap.barricade.oak |
1 | b / b |
logWood(OreDict,任一原木) |
trap.barricade.spruce |
1 | b / b |
Blocks.log meta 1 |
trap.barricade.birch |
1 | b / b |
Blocks.log meta 2 |
trap.barricade.jungle |
1 | b / b |
Blocks.log meta 3 |
只有橡木栅栏用 OreDict 的
logWood,另外三个写死 metadata。这也意味着没有白桦/丛林以外的木种变体(如杉木之外的新木种),想换成别的木种只能靠橡木那一条 + 手动摆放。
交互
| 触发 | 行为 |
|---|---|
实体(EntityLivingBase)碰撞竹刺 |
造成 meta/2 + 1 (+ 摔落加成) 点仙人掌伤害 + 缓慢 I |
| 右手拿竹刺右键竹刺 | metadata +1(上限 4),播放音效,创造模式不消耗 |
| 竹刺被打掉 | quantityDropped = meta + 1 ⇒ 掉 1–4 个 |
| 栅栏:手里拿栅栏右键(未潜行) | metadata +1(按 % 4 封顶 3),消耗 1 个 |
| 栅栏:被采集 | harvestBlock 先把 meta % 4 > 0 的方块降级 1 级留在原地,再掉 1 个物品 |
| 木栅栏 | 纯装饰+阻挡(碰撞盒是整格) |
相关条目
- SlimeIsland - 陷阱通常摆在黏液岛村庄的村口
- ToolWorkshopVillage - 同上
- MaterialItem - 竹刺/木栅栏都是零材料成本的"建材"
源码
tconstruct/world/TinkerWorld.java:161-165, 256-260, 752-780,tconstruct/blocks/traps/{Punji,BarricadeBlock}.java,git 8f6e2496f7(tag 1.14.113-GTNH)。