等离子炮

基本信息

属性 值
注册名 gravisuiteneo:sonicLauncher
英文名 Plasma Cannon [WIP](en_US.lang:6)
中文名 无中文翻译
实现类 com.gtnewhorizons.gravisuiteneo.items.ItemPlasmaLauncher
稀有度 EnumRarity.epic(ItemPlasmaLauncher.java:145)
最大堆叠 1(:37)
使用时长 1 tick(getMaxItemUseDuration,:43-45)——点射,不是蓄力
可修复 false(isRepairable,:149-151)
附魔ability 0(getItemEnchantability,:154-156)
贴图 gravisuiteneo:PlasmaCannon_0(:38)
GUI ID Properties.GUIID_PLASMALAUNCHER = 5(Properties.java:15)

⚠️ 注册名是 sonicLauncher(沿用父模组时期的命名,GraviSuiteNeoRegistry.java:46),但显示名是 Plasma Cannon。物品名键为 item.plasmaLauncher.name。

弹药槽

炮本身有 1 格内部弹药槽(InventoryItem,ItemPlasmaLauncher.java:120-124,只读槽 0):

槽 存放 取出
0 等离子电池 不可取出

getAmmunition 读槽 0;hasAmmunition(:129-131)即槽 0 非空。

开火流程

onItemRightClick(:48-111)按顺序判定:

步骤 条件 结果
1 服务端 && 玩家潜行 打开 GUI(GraviSuite.instance + GUI ID 5),直接 return,不开火
2 弹药槽无物品 红色提示 message.plasmaLauncher.noPlasmaCellFound
3 弹药里无流体 红色提示 message.plasmaLauncher.PlasmaCellEmpty
4 流体量 < 1000 红色提示 message.plasmaLauncher.NotEnoughPlasma
5 从弹药抽走 1000 mB 流体(:88) —
6 计算伤害系数(见下) —
7 弹药 EU 够 powerPerMaxShot 放电、生成 等离子球、播放音效、swingItem()
8 EU 不足 红色提示 message.plasmaLauncher.noEnergy

⚠️ 步骤 5 在步骤 7 之前无条件执行:即使 EU 不足、这一发最终没打出去,1000 mB 流体也已经被抽走(:88 在 :93 的 canUse 判断之前)。

伤害系数

float plasmaEnergyAmount = getPlasmaEfficiency(plasma) / 100;   // :90
plasmaEnergyAmount = Math.min(100.0F, plasmaEnergyAmount);       // :91  上限 100×

即效率值 ÷ 100,并硬性封顶 100.0。该系数作为 charge 传给 EntityPlasmaBallMKII(:94,entityType = 2)。

⚠️ 由于效率表存在 split(":", 1) 缺陷(见分类页「已知源码缺陷」第 1 条),若环境中没有 GregTech 提供的等离子流体,getPlasmaEfficiency 会走 fuelMap.getOrDefault(fluid, 0.0f) 返回 0.0f(GraviSuiteNeoRegistry.java:58)——而 ItemPlasmaCell.fill 又拒绝装入效率 < 1 的流体(ItemPlasmaCell.java:77),形成双重锁死:电池装不进任何流体,炮也就永远打不出实体弹。

数值

数值名 值 来源
每发耗流体 1000 mB PLASMA_AMOUNT_PER_SHOT(ItemPlasmaLauncher.java:32,private static final)
每发电耗 EU powerPerMaxShot = Properties.ElectricPresets.PlasmaLauncher.energyPerOperation = 1000000 EU :31、:35
弹药最大电量 100000000 EU Properties.java:121
弹药传输上限 375000 EU/t 同上
伤害系数上限 100.0 :91,硬编码
等离子球伤害 EntityPlasmaBallMKII.PLASMA_DAMAGE = 100.0F common/EntityPlasmaBallMKII.java:34
放电等级参数 99(传给 ElectricItem.manager.discharge) :97

⚠️ 炮本身不存电(无 IElectricItem 实现),全部电力来自弹药槽里的等离子电池。ElectricPresets.PlasmaLauncher.maxCharge = 10000000 这一项在本物品的类里没有被读取(ItemPlasmaLauncher 构造器只取 energyPerOperation,:35)。

提示与物品条

  • 弹药槽非空 → 复用 等离子电池 的 getToolTipInfo(:137)
  • 弹药槽为空 → message.plasmaLauncher.depleted(:139)
  • 物品条委托给电池(:165-208):getNumBars 有弹药时 2 条、无弹药时 0 条(:166);其余 6 个方法全部转发给 GraviSuiteNeoRegistry.itemPlasmaCell 的同名方法
  • getDamage 恒返回 0 并强制把 damage 写回 0(:159-162)——炮没有耐久条

声音

开火时 playSoundAtEntity(player, "gravisuiteneo:plasmaFired", 1.25F, 1.0F)(:113-115)——音量 1.25,音高 1.0。

配方

本仓库无配方。 common/RecipeHandler.registerRecipes()(common/RecipeHandler.java:15-43)只注册纳米机器人与史诗镐之背包两条 IC2 高级配方。

成就

gravisuite.craft_plasma,坐标 (-4, -2),普通类型,无前置(common/Achievements.java:29),是等离子成就树 3 个后继成就的根节点。

兼容映射

GraviSuite:sonicLauncher → gravisuiteneo:sonicLauncher(GraviSuiteNeo.java:75-77)。

已知注意点

getDamage 在每次被调用时都执行 stack.setItemDamage(0)(:160)——这是写操作而非只读,任何调用 getDamage 的代码都会改写物品 NBT。1.7.10 里 ItemStack.getItemDamage 与 Item.getDamageFromStack 语义不同,此处覆写的是后者,行为上与渲染/ tooltip 路径耦合。