Shield
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | battlegear2:shield.wood / .hide / .iron / .diamond / .gold |
| 类 | mods.battlegear2.items.ItemShield |
| 继承 | net.minecraft.item.Item |
| 接口 | IShield、IDyable、IEnchantable、ISheathed、IArrowCatcher、IArrowDisplay、IFuelHandler |
| 注册方式 | 构造函数内 GameRegistry.registerItem(this, "shield." + name)(ItemShield.java:57) |
| 材质定义 | mods.battlegear2.api.shield.ShieldType(ShieldType.java:17-26) |
| 堆叠上限 | 1(ItemShield.java:55) |
功能
盾牌是副手防御装备,必须放在副手才能格挡 —— 本仓库通过 Backhand 的 BackhandUtils 读取副手物品。
核心特性:
- 体力条格挡:按住原版「使用物品」键(
mc.gameSettings.keyBindUseItem)时按getDecayRate扣减体力条,归零则强制放下盾牌(BattlegearClientTickHandeler.java:107-123) - 体力恢复:未格挡时按
getRecoveryRate恢复,上限 1.0(BattlegearClientTickHandeler.java:131-134) - 接箭:实现
IArrowCatcher,格挡时把EntityArrow计入盾牌 NBT 并从玩家身上扣除(ItemShield.java:69-77) - 接箭开关:潜行右键切换「接箭」启用状态(
ItemShield.java:108-127)。注意该切换在副手持盾时不生效(!BackhandUtils.isUsingOffhand(player)守卫,ItemShield.java:110) - 染色:实现
IDyable,颜色存于 NBTdisplay.color(ItemShield.java:212-231) - 燃料:实现
IFuelHandler,仅木质盾牌注册为燃料(BattlegearConfig.java:287) - 附魔:本模组 7 个自定义附魔中仅盾牌实现
IEnchantable,故只有盾牌能承载它们(ItemShield.java:38、BaseEnchantment.java:44-46)
数值
5 种盾牌的数值全部来自 ShieldType 静态常量(ShieldType.java:17-26),构造参数依次为
(name, decayRate, damageDecay, maxDamage, enchantability, defaultColour)。
| 类型 | 耐久衰减 decayRate |
伤害衰减 damageDecay |
最大耐久 | 附魔力 | 默认颜色 |
|---|---|---|---|---|---|
wood |
1/1/20 | 1/20 | 40 | 15 | 0xFFbc9862 |
hide |
1/1.5/20 | 1/20 | 40 | 12 | 0xFF9b482b |
iron |
1/3/20 | 1/20 | 120 | 9 | 0xFFacacac |
diamond |
1/5/20 | 1/20 | 263 | 10 | 0xFF23bfbf |
gold |
1/2/20 | 1/20 | 56 | 25 | 0xFFa8a400 |
源码注释给出的预期格挡时长为 wood 1 秒、hide 1.5 秒、iron 3 秒、diamond 5 秒、gold 2 秒(ShieldType.java:18,20,22,24,26)。物品提示用 1F / decayRate / 20F 反算显示(ItemShield.java:190)。
| 派生数值 | 公式 | 来源 |
|---|---|---|
| 实际耐久衰减 | decayRate × (1 - shieldUsage 等级 × 0.1F) |
ItemShield.java:138-141 |
| 体力恢复速率 | 0.01F × (1 + shieldRecover 等级 × 0.2F)(注释称无附魔时约 5 秒回满) |
ItemShield.java:144-147 |
| 盾牌受击耐久损耗 | damageDecay × 本次伤害量 |
ItemShield.java:165-167 |
| 格挡角度 | 60 | ItemShield.java:170-172 |
| 盾击冷却 tick | 10 | ItemShield.java:175-177 |
| 盾击体力代价 | 0.33F - 0.06F × bashWeight 等级 |
BattlegearClientTickHandeler.java:66-67 |
| 接箭数量上限 | Short.MAX_VALUE |
ItemShield.java:94-96 |
| 修复材料 | wood→Blocks.planks、hide→Items.leather、iron→Items.iron_ingot、diamond→Items.diamond、gold→Items.gold_ingot |
ShieldType.java:18-26 |
getDamageReduction 恒返回 0(ItemShield.java:160-162);canBlock 仅排除 source.isUnblockable()(ItemShield.java:150-152)。
交互
| 触发 | 行为 |
|---|---|
| 按住使用物品键(副手持盾) | 扣减体力条,发送格挡包;体力归零则强制放下(BattlegearClientTickHandeler.java:107-123) |
| 松开使用物品键 | 发送放下包并按恢复速率回体力(BattlegearClientTickHandeler.java:124-135) |
| 受击(客户端) | 播放 battlegear2:shield 音效(ItemShield.java:155-157) |
| 受击(服务端) | 按 damageDecay × 伤害量 扣耐久(ItemShield.java:165-167) |
| 潜行右键(不在副手时) | 切换接箭开关,聊天框输出 Enabled/Disabled(ItemShield.java:108-127) |
| 弹射器发射 | 木质盾牌注册为燃料(BattlegearConfig.java:287) |
合成配方
5 种盾牌各一个 ShapedOreRecipe(BattlegearConfig.java:435-489)。
| 类型 | 形状 | 字符 |
|---|---|---|
wood |
W/WWW/W |
W = plankWood |
hide |
H/HWH/H |
W = plankWood,H = Items.leather |
iron |
I I/IWI/I |
W = plankWood,I = ingotIron |
diamond |
I I/IWI/I |
W = plankWood,I = gemDiamond |
gold |
I I/IWI/I |
W = plankWood,I = ingotGold |
另注册无序配方 ShieldRemoveArrowRecipie(battlegear:shieldarrowtaking,getRecipeSize 为 1)。它在合成栏中匹配恰好 1 个 IArrowDisplay 物品,输出该物品的副本并把 setArrowCount 置为 0 —— 即丢弃盾牌中已存的箭,而不是把它们返还为物品(ShieldRemoveArrowRecipie.java:14-46)。注意 getRecipeOutput() 硬编码返回 shield[2](铁盾),但因 getRecipeResult 被覆写,该返回值实际不参与合成结果(ShieldRemoveArrowRecipie.java:53-56)。
相关条目
- Spear - 唯一允许副手持盾的武器
- Battlegear 附魔 - 盾击与体力类附魔仅盾牌可承载
- Backhand 集成 - 副手物品读写全部经由 Backhand API