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,颜色存于 NBT display.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)。

相关条目