等离子炮
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | 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 路径耦合。