源码-魔法金属伤害计算

  1. 1. 总览
    1. 1.1. 版本
    2. 1.2. 位置
    3. 1.3. 源码
    4. 1.4. 前言
  2. 2. 解读
    1. 2.1. 概念
    2. 2.2. 逐步解释
    3. 2.3. 套装效果
    4. 2.4. 武器额外属性
    5. 2.5. 武士专精
    6. 2.6. 锻造前缀效果
    7. 2.7. 红色宝玉和黄色宝玉效果
    8. 2.8. 创伤系统
    9. 2.9. 饮食平衡系统
    10. 2.10. 装备效果
    11. 2.11. 淬炼宝玉效果
    12. 2.12. 药水效果
    13. 2.13. 目标药水效果表
    14. 2.14. 自身药水效果表
    15. 2.15. 武器强化加成
    16. 2.16. 武器星级效果
    17. 2.17. 灵力系统
    18. 2.18. 暗噬药水效果
    19. 2.19. 火锅和药水效果
    20. 2.20. 刺客专精
    21. 2.21. 古物系统
    22. 2.22. 献灵仪式效果
    23. 2.23. 职业武器加成
    24. 2.24. 二转技能战斗思想加成
    25. 2.25. 镀金系统
    26. 2.26. 特效武器
    27. 2.27. 攻击类型、武器附魔、职业属性、角色属性
    28. 2.28. 最大伤害计算
  3. 3. 其他属性计算

 

总览

版本

  • manametalmod-7.4.2

位置

- project.studio.manametalmod
    - event
        - EventFx.class
                - void combatAttack(LivingHurtEvent event)

源码

点此展开
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364

@SubscribeEvent(priority = EventPriority.HIGHEST)
public void combatAttack(LivingHurtEvent event) {
try {
if (event.source.func_76346_g() != null && event.source.func_76346_g() instanceof EntityPlayer && !(event.source.func_76346_g() instanceof net.minecraftforge.common.util.FakePlayer)) {
int true_physical_attack, true_magic_attack;
if (MMM.getDimensionID(event.entity.field_70170_p) == M3Config.WorldFutureID)
return;
Random random = event.entityLiving.field_70170_p.field_73012_v;
EntityPlayer player = (EntityPlayer)event.source.func_76346_g();
ItemStack item = player.func_71045_bC();
int Crit = 0;
int critBase = 0;
float Attack = 1.0F;
boolean cantrigger = true;
boolean canInfluencesDamage = true;
AttackEffect data = new AttackEffect();
float hp_blood = 0.0F;
float max_attack_damage = (float)M3Config.GlobalMaxDamage;
int PenetrationBase = 0;
int CritGame = random.nextInt(100);
boolean isCritAttack = false;
ManaMetalModRoot rootPlayer = MMM.getEntityNBT(player);
ManaMetalModRoot rootTarget = MMM.getEntityNBT(event.entityLiving);
int armorM = event.entityLiving.func_70658_aO();
boolean isDarkPower = false;
int goldPower = 0;
ManaElements Elements = null;
SpellType type = null;
WeaponType attackType = MMM.getWeaponTypeSource(item, event.source);
boolean isBoss = MMM.isEntityBoss((Entity)event.entityLiving);
boolean isLegendEntity = event.entityLiving instanceof project.studio.manametalmod.api.ILegendEntity;
int enchantmentLV = 0;
int monsterPenetratingDefense = 0;
boolean isIEntityData = event.entityLiving instanceof IEntityData;
float toughness = 0.0F;
EnchantmentsKeyEffect keyeffect = null;
if (item == null) {
event.ammount = 1.0F;
return;
}
if (rootPlayer == null || rootTarget == null)
return;
if (!MMM.isPlayerCreativeMode(player) && PotionEffectM3.isPotion(rootPlayer, PotionM3.potionPlayerDef)) {
event.setCanceled(true);
return;
}
if (player == event.entityLiving) {
event.setCanceled(true);
event.ammount = 0.0F;
return;
}
if (item != null &&
ManaMetalAPI.ItemDamageBlackList.containsKey(item.func_77973_b())) {
event.ammount = ((Integer)ManaMetalAPI.ItemDamageBlackList.get(item.func_77973_b())).intValue();
return;
}
if (event.entityLiving instanceof IJobAdvEntity) {
IJobAdvEntity IJobAdvEntitys = (IJobAdvEntity)event.entityLiving;
if (!IJobAdvEntitys.canPlayerAttackThis(player, rootPlayer.carrer.isTransfer2())) {
event.ammount = 1.0F;
return;
}
}
if (MMM.playerCanUseWeapon(player, rootPlayer) == UseWeaponResult.fail)
return;
if (event.source.field_76373_n != null &&
event.source.field_76373_n.equals("thorns")) {
int max_thorns_damage = 100 * rootPlayer.carrer.getLv();
if (player.func_70032_d((Entity)event.entityLiving) > 4.0F) {
event.ammount = 0.0F;
event.setCanceled(true);
return;
}
if (event.ammount > max_thorns_damage)
event.ammount = max_thorns_damage;
return;
}
if (item.func_77973_b() == ManaMetalMod.GodSword) {
event.ammount = 1.0E8F;
if (!(event.entityLiving instanceof EntityPlayer))
addDamageFX(event, false, player, rootPlayer);
if (event.entityLiving instanceof net.minecraft.entity.boss.IBossDisplayData) {
rootTarget.ManaEntityData.addbossRewardName(player, rootPlayer);
int i = rootPlayer.carrer.getDropRate() + data.drop_temp;
List<PotionEffectM3> list = PotionEffectM3.getPotions(rootPlayer);
i += PotionData.getDrop(list);
if (i > rootTarget.ManaEntityData.drop)
rootTarget.ManaEntityData.drop = i;
}
if (event.entityLiving instanceof IDungeonBoss) {
IDungeonBoss boss = (IDungeonBoss)event.entityLiving;
if (boss.isBoss()) {
rootTarget.ManaEntityData.addbossRewardName(player, rootPlayer);
int i = rootPlayer.carrer.getDropRate() + data.drop_temp;
List<PotionEffectM3> list = PotionEffectM3.getPotions(rootPlayer);
i += PotionData.getDrop(list);
if (i > rootTarget.ManaEntityData.drop)
rootTarget.ManaEntityData.drop = i;
}
}
return;
}
event.source.func_151518_m();
event.source.func_76348_h();
if (MMM.isTinkersConstruct && TConstructCore.isTCWeapon(item))
event.ammount *= 12.0F;
if (ManaMetalAPI.ItemAttackBalance.containsKey(item.func_77973_b())) {
BattleType typebattle = (BattleType)ManaMetalAPI.ItemAttackBalance.get(item.func_77973_b());
event.ammount += typebattle.attack;
attackType = typebattle.type;
type = typebattle.spellTypeBase;
}
if (MMM.isAether)
EventAetherM3.doEffectAttack(data, player);
rootPlayer.carrer.lastAttackTarget = event.entityLiving;
rootPlayer.mana.magicReliefTemp = 0.0F;
if (rootPlayer.carrer.isTransfer2())
max_attack_damage = (float)M3Config.GlobalMaxDamage2;
if (event.source instanceof EntityDamageSourceElement) {
EntityDamageSourceElement soure = (EntityDamageSourceElement)event.source;
type = soure.spell;
Elements = soure.Element;
attackType = soure.weapon;
cantrigger = soure.canTrigger;
canInfluencesDamage = soure.canInfluencesDamage;
}
ArmorEffect.doEffectAttackKit(player, data, cantrigger, event, rootPlayer, rootTarget);
WeaponEffect.doEffectAttack(data, MMM.getWeaponToolMaterial(item), player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount, cantrigger, item);
EventSpecialization.doEffectAttack(data, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount, cantrigger, attackType);
CastingEffect.doEffectAttack(data, item, player, cantrigger, attackType);
MagicJadeRed.getAttackEffect(data, player, event.entityLiving, event.source, rootPlayer, rootTarget, event.ammount, false, false);
DamageSystemEvent.doDamageAttack(data, player, event.source, rootPlayer, rootTarget);
FoodSystem.doEffect(data, player, rootPlayer);
ArmorEffect.doArmorData(data, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount, true);
QuenchingJadeCore.doEffectAttack(data, item, player, cantrigger);
PotionData.potionEffect(player, data, cantrigger, event.entityLiving, rootPlayer, rootTarget, attackType, true);
event.ammount += ItemStrengthenHelp.getWeaponAttackRoll(item) * ItemStrengthenHelp.getWeaponStrPower(item.func_77973_b());
ItemStrengthenHelp.getWeaponStarEvent(item, data, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount, cantrigger);
SpiritualPower.doEffectAttack(data, player, event.entityLiving, rootPlayer, rootTarget);
isDarkPower = ItemStrengthenHelp.darkPower(item, player, rootPlayer, data);
AttackEffect.add(data, rootPlayer.carrer.effect_hotpot);
AttackEffect.add(data, rootPlayer.carrer.effect_poison);
EventSpell.attack(item, data, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount);
ArcheologyCore.attack(data, player, event.entityLiving, event.source, rootPlayer, rootTarget);
TileEntitySacrificialCeremony.effect(data, player, event.entityLiving, event.source, rootPlayer, rootTarget);
if (CareerCore.testPlayerWeapon(player, CareerCore.getPlayerCarrer(player)))
Attack += 0.5F;
if (rootPlayer.carrer.isTransfer2())
event.ammount += (5 * rootPlayer.carrer.getSpellLV_2()[4]);
if (item.field_77990_d != null && item.field_77990_d.func_150297_b("Gilded", 3)) {
goldPower = item.field_77990_d.func_74762_e("Gilded");
Attack += 0.1F * goldPower;
}
if (item.func_77973_b() instanceof IFXItem && cantrigger) {
IFXItem fxitem = (IFXItem)item.func_77973_b();
fxitem.eventOnHit(data, player, event.entityLiving, event.source, rootPlayer, rootTarget, event.ammount, cantrigger);
}
if (attackType != null)
switch (attackType) {
case PhysicalMelee:
enchantmentLV = EnchantmentHelper.func_77506_a(Enchantment.field_77338_j.field_77352_x, item);
event.ammount += rootPlayer.carrer.getPhysicalAttack();
event.ammount += data.attack_base_physical;
data.attack += 0.01F * rootPlayer.carrer.getPowerPoint();
break;
case PhysicalRange:
enchantmentLV = EnchantmentHelper.func_77506_a(Enchantment.field_77345_t.field_77352_x, item);
event.ammount += rootPlayer.carrer.getPhysicalAttack();
event.ammount += rootPlayer.carrer.getArrowAttack();
event.ammount += data.attack_base_physical;
data.attack += 0.01F * rootPlayer.carrer.getAgilePoint();
break;
case Magic:
enchantmentLV = EnchantmentHelper.func_77506_a(ItemCraft10.ManaATK.field_77352_x, item);
event.ammount += rootPlayer.carrer.getMagicAttack();
event.ammount += data.attack_base_magic;
data.attack += 0.01F * rootPlayer.carrer.getIntelligencePoint();
break;
}
event.ammount += rootPlayer.carrer.mixAttack;
if (enchantmentLV > 0) {
event.ammount += (5 * enchantmentLV);
Attack += 0.1F * enchantmentLV;
}
max_attack_damage += data.max_attack_base;
max_attack_damage += rootPlayer.carrer.getMAXdamage();
if (event.source instanceof EntityDamageSourceElement)
max_attack_damage += ((EntityDamageSourceElement)event.source).max_damage_effect;
max_attack_damage *= 1.0F + data.max_attack;
critBase += data.crit;
Attack += data.attack;
Attack += rootPlayer.carrer.getAttackMultiplier();
hp_blood += data.hp_blood;
PenetrationBase += data.penetration_base;
event.ammount += data.attack_base;
data.final_attack += rootPlayer.carrer.finalDamage;
rootPlayer.carrer.extra_xpadd = data.xp;
data.career_increase += rootPlayer.carrer.career_increase;
if (event.entityLiving instanceof IDungeonBoss)
keyeffect = ((IDungeonBoss)event.entityLiving).getKeyEffect();
if (event.entityLiving instanceof net.minecraft.entity.boss.IBossDisplayData)
rootTarget.ManaEntityData.addbossRewardName(player, rootPlayer);
if (event.entityLiving instanceof IDungeonBoss) {
IDungeonBoss boss = (IDungeonBoss)event.entityLiving;
if (boss.isBoss())
rootTarget.ManaEntityData.addbossRewardName(player, rootPlayer);
}
Crit = rootPlayer.crit.getCritProbability(critBase);
if (Crit > 0) {
if (Crit > 100)
Crit = 100;
if (CritGame < Crit) {
isCritAttack = true;
Attack += rootPlayer.carrer.getCritDamage();
float crittemp = rootPlayer.carrer.getConPoint() * 0.003F;
if (crittemp > 1.0F)
crittemp = 1.0F;
if (M3Config.UseBalancedDietSystem)
crittemp += rootPlayer.carrer.food_data[4] * 0.01F;
crittemp += data.critDamage;
Attack += crittemp;
}
}
if (isBoss) {
Attack += rootPlayer.carrer.boss_attackMultiplier;
event.ammount += rootPlayer.carrer.boss_attack;
data.final_attack += rootPlayer.carrer.boss_final_attackMultiplier;
}
if (!isBoss) {
Attack += rootPlayer.carrer.monster_attackMultiplier;
event.ammount += rootPlayer.carrer.monster_attack;
data.final_attack += rootPlayer.carrer.monster_final_attackMultiplier;
}
if (M3Config.SoloMode)
data.career_increase += 0.5F;
if (canInfluencesDamage) {
event.ammount *= Attack;
event.ammount += event.ammount * data.final_attack;
event.ammount += event.ammount * data.career_increase;
event.ammount += data.no_tack_damage;
}
if (GameDifficult.getWorldDifficult().ordinal() > 0) {
float difficult = 0.1F * GameDifficult.getWorldDifficult().ordinal();
event.ammount *= 1.0F - difficult;
}
if (M3Config.UltimateDifficultyMode)
event.ammount *= 0.1F;
int playerLose = rootTarget.ManaEntityData.getLV() - rootPlayer.carrer.getLv();
if (playerLose > 0)
if (isLegendEntity) {
event.ammount -= event.ammount * playerLose * 0.1F;
} else {
event.ammount -= event.ammount * playerLose * 0.05F;
}
monsterPenetratingDefense = rootTarget.ManaEntityData.getPenetrationDefense();
if (isIEntityData)
monsterPenetratingDefense = ((IEntityData)event.entityLiving).getPenetrationDefense();
if (keyeffect != null)
monsterPenetratingDefense = (int)(monsterPenetratingDefense + keyeffect.getEffect(EnchantmentsKeyEffectType.enemyPenetratingDefenseBuff));
monsterPenetratingDefense -= data.lower_penetration_defense;
if (monsterPenetratingDefense > 0 && rootPlayer.carrer.getPenetrate() + PenetrationBase < monsterPenetratingDefense) {
float penetrationDefense = monsterPenetratingDefense;
float playerPenetrate = (rootPlayer.carrer.getPenetrate() + PenetrationBase);
float damageTamp = 1.0F;
if (isLegendEntity) {
damageTamp = (playerPenetrate * 2.0F - penetrationDefense) / penetrationDefense;
} else {
damageTamp = playerPenetrate / penetrationDefense;
}
if (damageTamp > 1.0F)
damageTamp = 1.0F;
if (damageTamp < 0.3F)
damageTamp = 0.3F;
event.ammount *= damageTamp;
}
if (isIEntityData) {
IEntityData ie = (IEntityData)event.entityLiving;
float dark_shield = ie.getShield()[0];
float gold_shield = ie.getShield()[1];
if (dark_shield > 0.0F &&
!isDarkPower)
event.ammount -= dark_shield * event.ammount;
if (gold_shield > 0.0F &&
goldPower < 3)
event.ammount -= gold_shield * (3 - goldPower) * event.ammount;
}
if (isIEntityData)
toughness = ((IEntityData)event.entityLiving).getDefense() - data.lower_toughness;
if (keyeffect != null)
toughness += keyeffect.getEffect(EnchantmentsKeyEffectType.enemyToughnessBuff);
toughness -= data.lower_toughness;
if (toughness > 0.0F) {
if (toughness > 0.95F)
toughness = 0.95F;
event.ammount -= event.ammount * toughness;
}
if (PotionEffectM3.isPotion(rootTarget, PotionM3.potionAbsoluteTenacity))
event.ammount *= 0.1F;
switch (attackType) {
case PhysicalMelee:
true_physical_attack = data.true_physical_attack + rootPlayer.carrer.true_physical_attack;
if (true_physical_attack > 0)
event.ammount += true_physical_attack;
break;
case Magic:
true_magic_attack = data.true_magic_attack;
if (true_magic_attack > 0)
event.ammount += true_magic_attack;
break;
}
if (Float.isInfinite(event.ammount))
event.ammount = max_attack_damage;
if (Float.isNaN(event.ammount))
event.ammount = 0.0F;
if (event.ammount > max_attack_damage)
event.ammount = max_attack_damage;
if (event.ammount < 0.0F)
event.ammount = 0.0F;
if (event.ammount > 0.0F &&
event.entityLiving instanceof DynamicHatred) {
DynamicHatred otboss = (DynamicHatred)event.entityLiving;
int OTdamage = (int)event.ammount;
OTdamage = (int)(OTdamage + OTdamage * (rootPlayer.carrer.extra_OTdamage + data.extra_OTdamage));
otboss.addOTToList((EntityLivingBase)player, OTdamage);
}
if (M3Config.UseBloodSystem &&
cantrigger && hp_blood > 0.0F && canVampire(rootPlayer) &&
player.func_110143_aJ() < player.func_110138_aP()) {
hp_blood = event.ammount * hp_blood;
float max_hp_blood = player.func_110138_aP() * rootPlayer.carrer.bloodDataMax;
float hp_addon = MMM.heal_blood(player, rootPlayer, hp_blood);
max_hp_blood -= rootPlayer.carrer.bloodData;
if (max_hp_blood > 0.0F) {
if (hp_blood > hp_addon)
hp_blood = hp_addon;
if (hp_blood > max_hp_blood)
hp_blood = max_hp_blood;
rootPlayer.carrer.addBloodData((int)hp_addon);
}
}
player.func_130011_c((Entity)event.entityLiving);
if (!(event.entityLiving instanceof EntityPlayer))
addDamageFX(event, isCritAttack, player, rootPlayer);
if (M3Config.CanEntityBleed && !Author.useChina)
bleed(event.entityLiving);
int treasure = rootPlayer.carrer.getDropRate() + data.drop_temp + rootPlayer.carrer.drop_temp;
treasure += PotionData.getDrop(PotionEffectM3.getPotions(rootPlayer));
treasure = (int)(treasure * M3Config.BaseTreasure);
if (treasure > rootTarget.ManaEntityData.drop)
rootTarget.ManaEntityData.drop = treasure;
if (event.ammount > 0.0F &&
event.entityLiving instanceof EntityGrassMan) {
EntityGrassMan grassman = (EntityGrassMan)event.entityLiving;
grassman.damage((int)event.ammount, Elements, type, attackType, player, (int)data.no_tack_damage, Attack, data.final_attack);
}
event.entityLiving.field_70737_aN = 0;
event.entityLiving.field_70172_ad = 0;
}
} catch (Exception e) {
e.printStackTrace();
}
}

前言

-

解读

概念

  • player/rootPlayer : 玩家自身实体
  • event.ammount : 伤害 / 物理、魔法攻击力
  • event.source : 伤害来源
  • ItemStack item = player.func_71045_bC(); : 武器/手持的物品
  • event.getEntityLiving : 获取被伤害的生物实体
  • event.setCanceled(true); : 设置伤害无效
  • field_76373_n : 外来伤害类型
  • 1.0E8F : 为1后面8个0,即100000000,F代表浮点类型
  • func_110143_aJ() : 当前血量
  • func_110138_aP() : 血量上限
  • mana.getMagicMax() : 魔力上限
  • attack : 造成的伤害
  • penetration_base : 穿透
  • critDamage : 暴击伤害
  • crit : 暴击率
  • avoid : 回避率
  • defense : 防御力
  • final_attack : 最终伤害
  • max_attack_base : 最大伤害
  • attack_base_physical : 物理攻击力
  • attack_base_magic : 魔法攻击力
  • mixAttack : 全能攻击力
  • hp_blood : 吸血
  • xp : 职业经验获取量
  • attack_base : 基础攻击力 百科上译为:物理/魔法攻击力
  • mana.magicReliefTemp : 魔力减免
  • no_tack_damage : 附加伤害 / 基础伤害
  • Attack : 伤害倍率
  • player.field_70170_p.field_73012_v.nextInt(10) == 0 : 10%概率
  • field_70170_p.field_72995_K : 为true时对象是客户端线程上的,反之在服务器线程上
  • field_70128_L : 单位是否死亡
  • func_70606_j : 设置目标单位当前生命值
    • 参考ItemToolOp.class
  • Produce : m3生产系统
  • addAllPower(AttackEffect data, int type, boolean isAttack) : 全能力提升,分伤害计算和受到伤害减免两部分,由第三参数isAttack区别,套装效果中攻击时伤害计算部分生效,受击时伤害减免部分生效,type取值范围[0, 10]
  • player.field_71071_by.func_146026_a(Items.field_151043_k) : 消耗物品(金锭)
  • func_70015_d() : setFire() 给予燃烧状态
  • func_70027_ad() : isBurning() 处于燃烧状态
  • func_70115_ae() : 处于骑乘状态
  • func_70690_d(new PotionEffect()) : 为对象添加原版药水效果
  • new PotionEffect(Potion.getPotionById(), 100, 0) : 原版药水效果,参数:药水id;持续时间,每20tick为1s,所以100代表5s;层数,如0为一层,2为三层。
  • field_70122_E() : onGround() 处于落地状态
  • func_70090_H : isInWater() 处于水下状态
  • root.carrer.food_data[0] : 饮食平衡系统谷类
  • root.carrer.food_data[1] : 饮食平衡系统蛋豆鱼肉类
  • root.carrer.food_data[2] : 饮食平衡系统蔬菜类
  • root.carrer.food_data[3] : 饮食平衡系统水果类
  • func_77942_o() : 检查物品是否有NBT标签
  • func_70691_i() : 回复血量(受限于最大血量限制)
  • func_70606_j() : 强制设置当前血量(可以超过最大血量)
  • func_110143_aJ() : 获取当前的血量数值

逐步解释

  • 仅解释含event.ammount的部分:
  • 代码自上而下顺序执行,后面可能会覆写前面效果

1
2
3
4
if (item == null) {
event.ammount = 1.0F;
return;
}
  • 空手时,伤害为 1,后续代码不执行。

1
2
if (rootPlayer == null || rootTarget == null)
return;
  • 若玩家单位或攻击单位为空,后续代码不执行。

1
2
3
4
5
if (player == event.entityLiving) {
event.setCanceled(true);
event.ammount = 0.0F;
return;
}
  • 玩家攻击到自己时伤害无效,伤害为 0。

1
2
3
4
5
if (item != null && 
ManaMetalAPI.ItemDamageBlackList.containsKey(item.func_77973_b())) {
event.ammount = ((Integer)ManaMetalAPI.ItemDamageBlackList.get(item.func_77973_b())).intValue();
return;
}
  • 手持ManaMetalAPI中指定的ItemDamageBlackList里的物品时,伤害为该物品的整数伤害数值。
  • ManaMetalAPI.ItemDamageBlackList中的物品包含:
    • Items.field_151110_aK : 鸡蛋
    • Items.field_151079_bi : 末影珍珠
    • Items.field_151126_ay : 雪球
    • Decoration.baserock : 石块
    • Items.field_151112_aM : 原版鱼竿
依据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// ManaMetalAPI.ItemDamageBlackList
- project.studio.manametalmod
- ManametalMod.class

ManaMetalAPI.ItemDamageBlackList.put(Items.field_151110_aK, Integer.valueOf(0));
ManaMetalAPI.ItemDamageBlackList.put(Items.field_151079_bi, Integer.valueOf(0));
ManaMetalAPI.ItemDamageBlackList.put(Items.field_151126_ay, Integer.valueOf(0));
ManaMetalAPI.ItemDamageBlackList.put(Decoration.baserock, Integer.valueOf(0));
ManaMetalAPI.ItemDamageBlackList.put(Items.field_151112_aM, Integer.valueOf(0));

// Items.field_151110_aK
- project.studio.manametalmod
- core
- ItemType.class

case egg:
return Items.field_151110_aK;

// Items.field_151079_bi
- project.studio.manametalmod
- defensive_tower
- DefensiveTowerCore.class

ManaMetalAPI.ManaMetalInjectionRecipeList.add(new ItemStack[] { new ItemStack(ManaMetalMod.ingotManaS, 1), new ItemStack(ManaMetalMod.ingotAncientThulium, 1), new ItemStack(ManaMetalMod.ingotAncientThulium, 1), new ItemStack(ManaMetalMod.ingotManaS, 1), qus, qus, qus, qus, new ItemStack(Items.field_151079_bi), new ItemStack(tower7) });

// Items.field_151126_ay
- project.studio.manametalmod
- event
- EventMana.class

if (event.item.func_92059_d().func_77973_b() == Items.field_151126_ay) {
PickItem.pickSnow(event, player);
return;
}

// Decoration.baserock
- project.studio.manametalmod
- earlystrength
- TileEntitySieve.class

list_sieve_sand.add(Decoration.baserock);

// Items.field_151112_aM
- project.studio.manametalmod
- produce.fishing
- FishingCore.class

RecipeRemover.removeAnyRecipe((Item)Items.field_151112_aM);
Craft.addShapelessRecipe(new ItemStack((Item)Items.field_151112_aM), new Object[] { fishrod_wood });

1
2
3
4
5
6
7
if (event.entityLiving instanceof IJobAdvEntity) {
IJobAdvEntity IJobAdvEntitys = (IJobAdvEntity)event.entityLiving;
if (!IJobAdvEntitys.canPlayerAttackThis(player, rootPlayer.carrer.isTransfer2())) {
event.ammount = 1.0F;
return;
}
}
  • 若攻击的对象实体含IJobAdvEntity接口,触发玩家职业是否已二转的判断,若不是二转职业,伤害为 1,后续代码不执行。
  • 含该接口的对象有:
    • 阿斯翠德 (BossAstrid)
    • 赤血恶龙 (BossBloodDragon)
    • 末日黑龙 (BossDoomsDragon)
    • 镜中梦魇 (BossMirror)
    • 艾莉西亚 (BossTime)
    • 神王禁卫·艾莉西亚 (BossTimeHard)
  • 即二转BOSS。
依据
1
2
3
4
5
6
7
8
9
// IJobAdvEntity接口仅含一个方法canPlayerAttackThis
public interface IJobAdvEntity {
boolean canPlayerAttackThis(EntityPlayer paramEntityPlayer, boolean paramBoolean);
}

// 该方法的实现为返回是否二转
public boolean canPlayerAttackThis(EntityPlayer player, boolean is2Job) {
return is2Job;
}

1
2
if (MMM.playerCanUseWeapon(player, rootPlayer) == UseWeaponResult.fail)
return;
  • 若无法使用武器,后续代码不执行。

1
2
3
4
5
6
7
8
9
10
11
12
if (event.source.field_76373_n != null && 
event.source.field_76373_n.equals("thorns")) {
int max_thorns_damage = 100 * rootPlayer.carrer.getLv();
if (player.func_70032_d((Entity)event.entityLiving) > 4.0F) {
event.ammount = 0.0F;
event.setCanceled(true);
return;
}
if (event.ammount > max_thorns_damage)
event.ammount = max_thorns_damage;
return;
}
  • 伤害来源为荆棘附魔时,荆棘伤害上限为100倍职业等级。
  • 双方距离大于4格时,取消伤害,伤害为 0,后续代码不执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
if (item.func_77973_b() == ManaMetalMod.GodSword) {
event.ammount = 1.0E8F;
if (!(event.entityLiving instanceof EntityPlayer))
addDamageFX(event, false, player, rootPlayer);
if (event.entityLiving instanceof net.minecraft.entity.boss.IBossDisplayData) {
rootTarget.ManaEntityData.addbossRewardName(player, rootPlayer);
int i = rootPlayer.carrer.getDropRate() + data.drop_temp;
List<PotionEffectM3> list = PotionEffectM3.getPotions(rootPlayer);
i += PotionData.getDrop(list);
if (i > rootTarget.ManaEntityData.drop)
rootTarget.ManaEntityData.drop = i;
}
if (event.entityLiving instanceof IDungeonBoss) {
IDungeonBoss boss = (IDungeonBoss)event.entityLiving;
if (boss.isBoss()) {
rootTarget.ManaEntityData.addbossRewardName(player, rootPlayer);
int i = rootPlayer.carrer.getDropRate() + data.drop_temp;
List<PotionEffectM3> list = PotionEffectM3.getPotions(rootPlayer);
i += PotionData.getDrop(list);
if (i > rootTarget.ManaEntityData.drop)
rootTarget.ManaEntityData.drop = i;
}
}
return;
}

// addDamageFX()
public void addDamageFX(LivingHurtEvent event, boolean isCrit, EntityPlayer player, ManaMetalModRoot root) {
if (event.ammount <= 0.0F || PotionEffectM3.isPotion(event.entityLiving, PotionM3.potionInvincible) || (PotionEffectM3.isPotion((EntityLivingBase)player, PotionM3.potionMissed) && player.field_70170_p.field_73012_v.nextInt(10) == 0)) {
PacketHandlerMana.INSTANCE.sendToAllAround((IMessage)new MessageDamageFX(0.0F, (float)event.entityLiving.field_70165_t, (float)event.entityLiving.field_70163_u, (float)event.entityLiving.field_70161_v, 0), new NetworkRegistry.TargetPoint(player.field_70170_p.field_73011_w.field_76574_g, player.field_70165_t, player.field_70163_u, player.field_70161_v, 64.0D));
event.setCanceled(true);
event.ammount = 0.0F;
return;
}
PacketHandlerMana.INSTANCE.sendToAllAround((IMessage)new MessageDamageFX(event.ammount, (float)event.entityLiving.field_70165_t, (float)event.entityLiving.field_70163_u, (float)event.entityLiving.field_70161_v, isCrit ? 1 : 0, event.entityLiving.func_145782_y(), root.fashion.func_70301_a(14)), new NetworkRegistry.TargetPoint(player.field_70170_p.field_73011_w.field_76574_g, player.field_70165_t, player.field_70163_u, player.field_70161_v, 64.0D));
}
  • 若手中武器为创造者之剑:
    • 伤害设为1.0E8F。
    • 若受击方不是玩家单位,触发addDamageFX()。
    • 若受击方是BOSS单位,将玩家添加到“可获取BOSS掉落物”列表中,并计算掉宝率。
    • 若受击方含IDungeonBoss接口(地下城怪),再判断是否为BOSS,将玩家添加到“可获取BOSS掉落物”列表中,并计算掉宝率。
    • 后续代码不执行。
  • 这部分代码有点冗余,判断BOSS单位何不直接调用MMM.isEntityBoss(),估计是迭代过,懒得改原先能跑通的代码。
  • addDamageFX()方法:
    • 猜测为发送造成伤害通知。
    • 伤害为0或有无敌药水效果等情况,会取消伤害。
    • 其他情况下发送64格范围全体通知,应用伤害字型时装,产生伤害特效。
  • 掉宝率计算方式:
    • i = 职业掉宝率+临时掉宝率
    • i加上从M3药水效果中得到的临时掉宝率
    • 若i大于对方掉宝率,对方掉宝率变为i
  • 目前该掉宝率作用未知
依据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// net.minecraft.entity.boss.IBossDisplayData
- project.studio.manametalmod
- MMM.class

public static final boolean isEntityBoss(Entity entity) {
if (entity instanceof net.minecraft.entity.boss.IBossDisplayData)
return true;
if (entity instanceof IDungeonBoss)
return ((IDungeonBoss)entity).isBoss();
return false;
}

// MessageDamageFX
- project.studio.manametalmod
- network
- MessageDamageFX.class

public MessageDamageFX(float damge, float posX, float posY, float posZ, int type, int entity, ItemStack NumberFashion) {
this.Damage = damge;
this.x = posX;
this.y = posY;
this.z = posZ;
this.type = type;
this.entity = entity;
this.hasNumberFashion = true;
this.NumberFashion = NumberFashion;
}

// PotionData.getDrop
- project.studio.manametalmod
- potion
- PotionData.class

public static final int getDropBase(PotionM3 potion) {
switch (potion) {
case potiotMoney:
case potionElves1:
case potionBattleAxe:
return 30;
case potionGoldenDagger:
case potionGrass:
return 25;
case potionCofe:
return 10;
}
return 0;
}


1
2
event.source.func_151518_m();
event.source.func_76348_h();

1
2
if (MMM.isTinkersConstruct && TConstructCore.isTCWeapon(item))
event.ammount *= 12.0F;
  • 若手中武器为匠魂的武器,伤害 × 12。

1
2
3
4
5
6
if (ManaMetalAPI.ItemAttackBalance.containsKey(item.func_77973_b())) {
BattleType typebattle = (BattleType)ManaMetalAPI.ItemAttackBalance.get(item.func_77973_b());
event.ammount += typebattle.attack;
attackType = typebattle.type;
type = typebattle.spellTypeBase;
}
  • 若手中武器属于ManaMetalAPI.ItemAttackBalance列表中的物品,伤害加上武器attack属性的值。
ManaMetalAPI.ItemAttackBalance中的物品包含
  • Botania
    • manaGun
    • terraSword
    • thunderSword
    • crystalBow
    • starSword
    • elementiumSword
    • livingwoodBow
    • enderDagger
    • thornChakram
    • kingKey
    • missileRod
  • aether
    • notch_hammer
    • lightning_knife
    • phoenix_bow
    • dart_shooter
    • zanite_sword
    • gravitite_sword
    • flaming_sword
    • lightning_sword
    • holy_sword
    • valkyrie_lance
    • vampire_blade
  • aoa
    • HauntersStaff
  • thaumcraft
    • itemSwordElemental
    • itemSwordVoid
    • itemSwordCrimson
    • itemBowBone
    • itemWandCasting
  • ChocolateQuest
    • musket
    • revolver
    • staffPhysic
    • staffMagic
    • staffBlast
    • staffFire
    • staffLight
    • ironSwordAndShield
    • diamondSwordAndShield
    • spiderSpear
    • bullAxe
    • ironBigsword
    • diamondBigsword
    • bigSwordBull
    • monkingSword
    • ironDagger
    • diamondDagger
    • tricksterDagger
    • ninjaDagger
    • monkingDagger
    • ironSpear
    • diamondSpear
    • spearGun
    • fireSpear
  • ImmersiveEngineering
    • itemRailgun
    • itemRevolver
    • itemChemthrower
  • Metallurgy
    • GameRegistry.findItem(“Metallurgy”, item.toLowerCase() + “.sword”)
  • Techguns
    • (GenericGun)item
  • ThaumBasic
    • herobrinesScythe
    • revolver
  • ThaumicTinkerer
    • sword
    • sword2

1
2
if (MMM.isAether)
EventAetherM3.doEffectAttack(data, player);
Aether(天境)Mod伤害计算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static final void doEffectAttack(AttackEffect data, EntityPlayer player) {
PlayerAether PA = PlayerAether.get(player);
IAccessoryInventory IAI = PA.getAccessoryInventory();
for (int s = 0; s < IAI.func_70302_i_(); s++) {
ItemStack temp = IAI.func_70301_a(s);
if (temp != null &&
temp.func_77973_b() instanceof ItemAccessoryM3) {
ItemAccessoryM3 m3data = (ItemAccessoryM3)temp.func_77973_b();
data.attack_base += m3data.attack;
data.crit += m3data.crit;
data.penetration_base += m3data.penetrate;
}
}
}

1
2
rootPlayer.carrer.lastAttackTarget = event.entityLiving;
rootPlayer.mana.magicReliefTemp = 0.0F;
  • 记录玩家最后攻击的对象
  • magicReliefTemp值归零,暂不明确用途

1
2
if (rootPlayer.carrer.isTransfer2())
max_attack_damage = (float)M3Config.GlobalMaxDamage2;
  • 若玩家已二转,将最大伤害设为M3配置文件中的GlobalMaxDamage2

1
2
3
4
5
6
7
8
if (event.source instanceof EntityDamageSourceElement) {
EntityDamageSourceElement soure = (EntityDamageSourceElement)event.source;
type = soure.spell;
Elements = soure.Element;
attackType = soure.weapon;
cantrigger = soure.canTrigger;
canInfluencesDamage = soure.canInfluencesDamage;
}
  • 若伤害类型是一种EntityDamageSourceElement,获取其type等属性。
  • 参考

套装效果

1
ArmorEffect.doEffectAttackKit(player, data, cantrigger, event, rootPlayer, rootTarget);
  • 应用盔甲效果
    • 判断是否装备全套套装。
    • 判断全套盔甲是否都为装备类型。
    • 判断通过后返回盔甲材质,根据材质应用不同套装效果。
  • 套装效果详解
    • 注:伤害计算的套装效果计算时不包含百科中“受到伤害时”、“额外消耗魔力”等词条,在EventFx.entityHurtsFX()方法中计算受到伤害效果。
    • 若盔甲是ItemToolArmorSpecial,即可升级的盔甲,也即那些毕业套。
    • 获取套装中最低的等级,若不是全套ItemToolArmorSpecial或套装类别不统一,则返回-1。
    • 当最低等级大于-1,获取盔甲路线和材质进行应用效果。
    • 盔甲路线对应:0——基础 1——深渊路线 2——超越路线

  • DefendGuard_1(保卫使者):
    • 深渊路线-深渊守门人套装:
      • 强化等级 >= 5阶:防御力+75后防御力+5%。
      • 强化等级 >= 15阶:防御力+15%、伤害减免+10%。
      • 强化等级 >= 30阶:攻击时获得7s最大5层每次叠加1层的药水效果“深渊护卫的意志”,冷却时间2秒。 注:百科上原文为“持续5秒”。
      • 强化等级 >= 35阶:防御力+20%、伤害减免+15%。
      • 强化等级 >= 40阶:防御力-400,之后剩余的所有防御力若大于0,乘以0.4加到攻击力上,用于转换的防御力不会损失。
    • 基础与超越路线-神圣守护者套装:
      • 强化等级 >= 5阶:防御力+50、伤害减免+5%。
      • 强化等级 >= 15阶:防御力+10%、伤害减免+10%。
      • 强化等级 >= 30阶:攻击时获得7s最大5层每次叠加1层的药水效果“巨人守卫的意志”,冷却时间2秒。
      • 强化等级 >= 35阶:防御力+20%。
  • WraithReaper_1(亡魂死神):
    • 套装效果:攻击生命值低于50%的目标时,造成的伤害提高30%、穿透值提高4点。
    • 深渊路线-残暴梦魇套装:
      • 强化等级 >= 5阶:造伤+10%、爆伤+5%。
      • 强化等级 >= 10阶:攻击时获得10s最大100层每次叠加1层的药水效果“无尽梦魇”,无冷却时间。
      • 强化等级 >= 15阶:造伤+15%、爆伤+10%。
      • 强化等级 >= 20阶:造伤+7%、爆伤+5%,攻击时获得5s最大5层每次叠加1层的药水效果“残暴屠宰”,冷却时间2秒。
      • 强化等级 >= 25阶:造伤+20%、爆伤+15%。
      • 强化等级 >= 30阶:攻击时,所有以玩家为中心,11格半径内的单位(是EntityMob或含net.minecraft.entity.monster.IMob接口)获得5秒0级的药水效果“噩梦领域”,冷却时间5秒。
      • 强化等级 >= 35阶:攻击拥有状态“噩梦领域”的单位额外造成50%暴击伤害。
      • 强化等级 >= 40阶:最终伤害+25%、造伤+25%、暴伤+50%。
      • 强化等级 >= 45阶:攻击时,根据6格半径内拥有“噩梦领域”状态的目标数量,每个增加5%造伤、3%暴伤。
    • 基础与超越路线-审判之眼套装:
      • 强化等级 >= 5阶:基础攻击力+18。
      • 强化等级 >= 10阶:对BOSS单位造伤+10%。
      • 强化等级 >= 15阶:基础攻击力+36。
      • 强化等级 >= 20阶:攻击时10%概率获得16s最大10层每次叠加1层的药水效果“灵魂虹吸”,无冷却时间。状态>=10层时,触发叠加时对BOSS单位造伤+20%。
      • 强化等级 >= 25阶:攻击生命值低于50%的BOSS单位时,造伤+30%(该BOSS单位在服务器线程上)。
      • 强化等级 >= 30阶:攻击生命值低于50%的BOSS单位时,造伤+20%,爆伤+10%,同时目标获得7秒0级的药水效果“死神印记”,无冷却时间。
      • 强化等级 >= 35阶:攻击BOSS单位时,造伤+75%;攻击非BOSS单位时,造伤-50%。
      • 强化等级 >= 40阶:若目标单位有“死神印记”效果,使自身获得7秒0级的药水效果“审判者之眼”,无冷却时间。
      • 强化等级 >= 45阶:若目标单位有“死神印记”效果,,使目标获得6s最大10层每次叠加1层的药水效果“审判终曲”,无冷却时间。若自身拥有“审判者之眼”状态,且目标拥有“审判终曲”状态,终伤+10%。
      • 强化等级 >= 50阶:若目标单位未死亡、拥有“审判终曲”状态、没有无敌药水状态、血量低于生命上限的1%,玩家(服务端)将该目标当前生命值设置为1点。注:百科上原文为“立即杀死”
  • SecretMagic_1(秘法魔力):
    • 套装效果:魔力值高于90%时,造伤+30%、穿透+4。
    • 深渊路线-禁忌秘术套装:
      • 强化等级 >= 5阶:造伤+12%,魔力减免+1%。
      • 强化等级 >= 10阶:造伤+20%。
      • 强化等级 >= 15阶:造伤+16%,魔力减免+2%。
      • 强化等级 >= 25阶:造伤+24%,魔力减免+4%。
      • 强化等级 >= 30阶:增加等同于32%魔力上限的附加伤害。
      • 强化等级 >= 35阶:当自身“超能负荷”状态>=5层时,终伤+10%,爆伤+15%。
      • 强化等级 >= 40阶:攻击时获得15s最大(玩家魔力上限的30%)层每次叠加(基本伤害 * 0.03F + 1.0F)层的药水效果“魔力护盾”,无冷却时间。
      • 强化等级 >= 45阶:若玩家拥有“魔力护盾”状态,造伤+35%,暴击率+30,爆伤+10%,攻击时增加3%基本伤害的魔力值。
    • 基础与超越路线-符纹魔导套装:
      • 强化等级 >= 5阶:攻击时增加0.1%基本伤害的魔力值,魔力减免+1%。
      • 强化等级 >= 10阶:攻击时获得45秒(玩家魔力上限的15%)层的药水效果“魔力护盾”,冷却时间45秒。
      • 强化等级 >= 15阶:攻击时增加0.1%基本伤害的魔力值,魔力减免+2%。
      • 强化等级 >= 25阶:攻击时增加0.2%基本伤害的魔力值,魔力减免+4%。
      • 强化等级 >= 30阶:增加等同32%最大魔力值的附加伤害。
      • 强化等级 >= 35阶:若自身拥有“魔力护盾”状态,造伤+20%,爆伤+15%,暴击率+15,回避率+15。
      • 强化等级 >= 50阶:攻击时若自身未持有“魔导爆发”状态,则获得7s最大20层每次叠加1层的药水效果“魔导充能”,无冷却时间。
  • EternalSpirit_1(永生之灵)
    • 深渊路线-无尽贪欲套装:
      • 强化等级 >= 5阶:吸血+2%。
      • 强化等级 >= 10阶:攻击时获得10s最大10层每次叠加1层的药水效果“血刃切割”,冷却时间2秒。触发叠加效果时,若“血刃切割”层数>=10,吸血+5%,附加伤害+目标血量上限的1%(BOSS单位为0.1%)。
      • 强化等级 >= 15阶:吸血+4%。
      • 强化等级 >= 20阶:攻击时获得20秒0级的药水效果“血色愉悦”,无冷却时间。同时造伤+35%,爆伤+10%。
      • 强化等级 >= 25阶:攻击时获得20s最大5层每次叠加1层的药水效果“嗜血本能”,冷却时间3秒。
      • 强化等级 >= 30阶:攻击时若自身血量大于最大生命的90%,终伤+10%,爆伤+20%。
      • 强化等级 >= 40阶:攻击时若自身血量小于最大生命的70%,吸血+4%。
      • 强化等级 >= 45阶:攻击时获得5s最大10层每次叠加1层的药水效果“鲜血渴望”,无冷却时间。每层增加4%造伤。状态>=10层时,终伤+10%。
    • 基础与超越路线-永恒神灵套装:
      • 强化等级 >= 20阶:攻击时附加等同自身最大生命值16%的附加伤害。
      • 强化等级 >= 25阶:未拥有任何创伤时,攻击附加等同自身最大生命值32%的附加伤害。
      • 强化等级 >= 30阶:若自身血量大于最大生命的50%,造伤+30%,获得20秒0级的药水效果“生命之源-力量”,无冷却时间;反之,获得20秒0级的药水效果“生命之源-抵御”,无冷却时间。
      • 强化等级 >= 50阶:攻击时获得7s最大5层每次叠加1层的药水效果“神灵祝福”,冷却时间2秒。状态>=5层时,增加最大生命值64%的附加伤害。

  • 返回ArmorEffect.class的void doEffectAttack,应用其他套装效果。
  • HighlycrystalArmor_1(致命晶套装)
    • 造伤+40%,攻击目标不为空时,移除服务端玩家的“剧毒”药水效果
  • Adamantine_1(精金套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
    • 造伤+70%,吸血+5%。
  • Mithril_1(秘银套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
    • 造伤+60%,吸血+5%。
  • SoulSteel_1(魂钢套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
    • 造伤+50%,吸血+5%。
  • MysteriousIron_1(玄铁套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
    • 造伤+40%,吸血+5%。
  • HolyCopper_1(圣铜套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
    • 造伤+30%,吸血+5%。
  • BloodDragonArmor_1(恶咒套装)
    • 血量大于最大生命的90%时,造伤+60%,全能力巨量提升(type=5):造伤+40%,暴击率+14,穿透+6,终伤+6%。
    • 注:百科上原文为“生命值高于90%时,全能力极大提升,造成的伤害增加45% ”。
  • LapudaCore.MeteoriteArmor.ArmorMaterials[0](初-远古套装)
    • 全能力中幅提升(type=1):造伤+20%,暴击率+6,穿透+2,终伤+2%。
    • 血量大于最大生命的90%时,造伤+20%。
  • LapudaCore.MeteoriteArmor.ArmorMaterials[1](极-远古套装)
    • 全能力大幅提升(type=2):造伤+25%,暴击率+8,穿透+3,终伤+3%。
    • 血量大于最大生命的90%时,造伤+20%。
  • LapudaCore.MeteoriteArmor.ArmorMaterials[2](灭-远古套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
    • 血量大于最大生命的90%时,造伤+20%。
  • LapudaCore.MeteoriteArmor.ArmorMaterials[3](真-远古套装)
    • 全能力海量提升(type=4):造伤+35%,暴击率+12,穿透+5,终伤+5%。
    • 血量大于最大生命的90%时,造伤+20%。
  • oceanArmor_1(海洋套装)
    • 全能力小幅提升(type=0):造伤+15%,暴击率+4,穿透+1,终伤+1%。
    • 每级垂钓等级增加4%造伤。
  • farmArmor_1(丰饶套装)
    • 全能力小幅提升(type=0):造伤+15%,暴击率+4,穿透+1,终伤+1%。
    • 每级农耕等级增加4%造伤。
  • BossStartDragonArmor_1(星辰龙套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
    • 造伤+40%。
  • TempleArmor_1(失落套装)
    • 全能力中幅提升(type=1):造伤+20%,暴击率+6,穿透+2,终伤+2%。
    • 攻击BOSS时,造伤+40%。
  • StrongholdArmor_1(红光战神套装)
    • 血量小于最大生命的50%时,造伤+80%,全能力海量提升(type=4):造伤+35%,暴击率+12,穿透+5,终伤+5%。
  • ShadowSecretGold_1(暗影秘金套装)
    • 全能力小幅提升(type=0):造伤+15%,暴击率+4,穿透+1,终伤+1%。
    • 每级采矿等级增加4%造伤。
  • FeatherSnakeArmor_1(白羽套装)
    • 全能力大幅提升(type=2):造伤+25%,暴击率+8,穿透+3,终伤+3%。
    • 攻击时服务端玩家获得10s最大0层的药水效果“羽蛇守护”,无冷却时间
  • DungeonGolden_1(神庙金套装)
    • 全能力大幅提升(type=2):造伤+25%,暴击率+8,穿透+3,终伤+3%。
    • 攻击时消耗金锭,造伤+60%,穿透+4。
  • WeaponCore.bedrock_level_1.ArmorMaterials[1](基岩魔力-全能套装)
    • 全能力中幅提升(type=1):造伤+20%,暴击率+6,穿透+2,终伤+2%。
  • WeaponCore.bedrock_level_1.ArmorMaterials[2](基岩魔力-攻击套装)
    • 造伤+25%,暴击率+8。
  • WeaponCore.bedrock_level_1.ArmorMaterials[3](基岩魔力-防御套装)
    • 吸血+5%。
  • WeaponCore.bedrock_level_2.ArmorMaterials[1](基岩勇士-全能套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
  • WeaponCore.bedrock_level_2.ArmorMaterials[2](基岩勇士-攻击套装)
    • 造伤+35%,暴击率+8。
    • 注:百科原文为”暴击率提高12点”。
  • WeaponCore.bedrock_level_2.ArmorMaterials[3](基岩勇士-防御套装)
    • 吸血+10%。
  • LegendaryWeaponCore.Bear(野熊套装)
    • 职业经验获取量+10%。
  • LegendaryWeaponCore.Falcon(老鹰套装)
    • 暴击率+15,职业经验获取量+10%。
  • LegendaryWeaponCore.Fox(狡狐套装)
    • 穿透+5,职业经验获取量+10%。
  • LegendaryWeaponCore.Wolf(野狼套装)
    • 造伤+15%,职业经验获取量+10%。
  • UndeadGraveCore.ArmorM1(勇士套装)
    • 造伤+10%,吸血+5%。
  • UndeadGraveCore.ArmorM2(游侠套装)
    • 造伤+20%,暴击率+7。
  • UndeadGraveCore.ArmorM2(法师套装)
    • 造伤+10%,暴击率+5。
    • 攻击时,服务端玩家恢复15点魔力值。
  • WeaponCore.legend_ore.ArmorMaterials[0](地狱使者套装)
    • 全能力小幅提升(type=0):造伤+15%,暴击率+4,穿透+1,终伤+1%。
  • WeaponCore.legend_ore.ArmorMaterials[1](充能地狱使者套装)
    • 全能力中幅提升(type=1):造伤+20%,暴击率+6,穿透+2,终伤+2%。
  • WeaponCore.legend_ore.ArmorMaterials[2](觉醒地狱使者套装)
    • 全能力大幅提升(type=2):造伤+25%,暴击率+8,穿透+3,终伤+3%。
  • WeaponCore.legend_ore.ArmorMaterials[3](真。地狱使者套装)
    • 全能力巨量提升(type=3):造伤+30%,暴击率+10,穿透+4,终伤+4%。
  • WeaponCore.epic_ore.ArmorMaterials[0](传说勇士套装)
    • 造伤+10%,暴击率+3。
  • WeaponCore.epic_ore.ArmorMaterials[1](充能传说勇士套装)
    • 造伤+15%,暴击率+5。
  • WeaponCore.epic_ore.ArmorMaterials[2](觉醒传说勇士套装)
    • 造伤+20%,暴击率+7。
  • WeaponCore.epic_ore.ArmorMaterials[3](真。传说勇士套装)
    • 造伤+25%,暴击率+9。
  • ItemArmor.ArmorMaterial.GOLD(金套装)
    • 造伤+30%。
  • ItemArmor.ArmorMaterial.CHAIN(锁链套装)
    • 造伤+15%,穿透+3。
  • ManaMetalMod.ArmorKnight(骑士套装)
    • 暴击率+5,穿透+2。
  • ItemArmor.ArmorMaterial.DIAMOND(钻石套装)
    • 造伤+10%。
    • 服务端玩家攻击时对目标赋予10s最大0层的“破甲”药水效果,无冷却时间。
  • WeaponCore.BloodMetal.armorMaterial(暗红钢套装)
    • 吸血+10%。
  • WeaponCore.Dark.armorMaterial(黑暗钢套装)
    • 血量小于最大生命的30%时,造伤+35%。
  • WeaponCore.AncientThulium.armorMaterial(远古铥套装)
    • 攻击的目标为上一次攻击的目标时,造伤+20%。
  • WeaponCore.ManaS.armorMaterial(魔法钢套装)
    • 服务端玩家恢复20魔力值。
  • WeaponCore.UniverseEnergy.armorMaterial(宇宙能量套装)
    • 造伤+20%,暴击率+5。
  • WeaponCore.NeutronEnergy.armorMaterial(奥哈立尔钢套装)
    • 造伤+10%。
  • WeaponCore.Endless.armorMaterial(无限钢套装)
    • 魔力值高于50%时,造伤+25%。
  • WeaponCore.Crimson.armorMaterial(红莲金属套装)
    • 生命大于等于血量上限时,造伤+35%。
  • WeaponCore.Cobalt.armorMaterial(钴蓝套装)
    • 造伤+15%。
  • WeaponCore.Palladium.armorMaterial(钯金套装)
    • 吸血+5%。
  • WeaponCore.RuneSteel.armorMaterial(符纹钢套装)
    • 全能力小幅提升(type=0):造伤+15%,暴击率+4,穿透+1,终伤+1%。
  • WeaponCore.TrueAncientThulium.armorMaterial(觉醒远古铥战斗套装)
    • 造伤+20%,吸血+5%。
  • armor_Titanium_1(钛金套装)
    • 全能力中幅提升(type=1):造伤+20%,暴击率+6,穿透+2,终伤+2%。
  • armor_Lead_1(重铅套装)
    • 造伤+10%,爆伤+10%。
  • goldSteeleafIngotArmor_1(黄金钢叶套装)
    • 全能力中幅提升(type=1):造伤+20%,暴击率+6,穿透+2,终伤+2%。
    • 攻击Boss单位时,造伤+20%。
  • powerIronwoodIngotArmor_1(强化铁木套装)
    • 全能力中幅提升(type=1):造伤+20%,暴击率+6,穿透+2,终伤+2%。
    • 吸血+5%。
  • FIERY(炽铁套装)
    • 攻击正在燃烧的目标时,造伤+35%。
  • KNIGHTMETAL(骑士套装)
    • 骑乘时,造伤+50%。
  • KNIGHTPHANTOM(幻影骑士套装)
    • 全能力大幅提升(type=2):造伤+25%,暴击率+8,穿透+3,终伤+3%。
    • 吸血+10%。
  • YETI(雪怪套装)
    • 全能力大幅提升(type=2):造伤+25%,暴击率+8,穿透+3,终伤+3%。
    • 服务端玩家攻击目标时,目标获得10秒2级的冰缓效果,无冷却时间。
  • ARCTIC(极地套装)
    • 全能力中幅提升(type=1):造伤+20%,暴击率+6,穿透+2,终伤+2%。
  • CompressionSteelArmor_1(压缩钢套装)
    • 造伤+20%,吸血+10%。
  • MMM.isThaumcraft 神秘:
  • MisriruArmorMaterial(米斯里鲁套装)
    • 造伤+35%。
  • MisriruArmorMaterialTrue(觉醒米斯里鲁套装)
    • 造伤+50%,吸血+15%。
  • SPECIAL(揭示护目镜)
    • 造伤+20%,穿透+2。
  • VOID(虚空套)
    • 造伤+20%,穿透+4,吸血+10%。
  • FORTRESS(神秘要塞套装)
    • 造伤+30%,吸血+10%。
  • MMM.isBotania 植物魔法:
  • MANASTEEL(魔钢套装)
    • 魔力大于50%时,造伤+20%,穿透+5。
  • TERRASTEEL(泰拉钢套)
    • 造伤+30%,吸血+10%。
  • B_ELEMENTIUM(源质钢套装)
    • 魔力低于80%时,造伤+30%,穿透+5。
  • MANAWEAVE(魔源套装)
    • 造伤+10%,穿透+2
    • 攻击时恢复50魔力。
  • MMM.isMoCreatures 更多生物:
  • crocARMOR()
    • 造伤+25%。
    • 服务端玩家攻击目标时,使目标获得5秒2级的冰缓效果,无冷却时间。
  • furARMOR(毛皮套装)
    • 造伤+20%。
  • hideARMOR(兽皮套装)
    • 造伤+20%,穿透+4。
  • MMM.isAether 天境:
  • Armor_Zanite(紫晶套装)
    • 造伤+10%,穿透+2。
  • Armor_Gravitite(重力晶套装)
    • 玩家处于落地状态时,造伤+60%。
  • Armor_Neptune(海神套装)
    • 玩家处于水下状态时,造伤+65%,穿透+8。
  • Armor_Phoenix(凤凰套装)
    • 服务端玩家攻击目标时,使目标燃烧10s。若目标处于燃烧状态,造伤+90%。
  • Armor_Obsidian(黑曜套装)
    • 穿透+11,吸血+10%。
  • Armor_Valkyrie(武神套装)
    • 造伤+30%,穿透+5,吸血+10%。
  • MMM.isChocolateQuest 寻找巧克力:
  • CQ_dragon(龙之头盔)
    • 造伤+60%,穿透+9。
  • CQ_king(国王盔甲)
    • 造伤+30%,吸血+10%。
  • TURTLE(乌龟套装)
    • 吸血+10%。
    • 服务端玩家获得200秒0级的药水效果PotionM3.potionbrewing3和PotionM3.potionResistance2,无冷却时间。
  • MONSTER_FUR(未找到翻译,可能为蜘蛛套装)
    • 造伤+30%。
    • 服务端玩家攻击目标时,使目标获得5秒2级的冰缓效果,无冷却时间。
  • CQ_bull(公牛套装)
    • 增加等同于防御值的基础攻击力。
  • CQ_slime(史莱姆套装)
    • 服务端玩家攻击时消耗粘液球,造伤+70%。
    • 服务端玩家攻击时有20%概率获得一个粘液球。
  • CQ_mage(法师套装)
    • 造伤+10%。
    • 服务端玩家攻击时恢复60魔力值。
  • MMM.isMetallurgy 冶金:
  • metallurgy.tartarite(熔火石套装)
    • 造伤+50%,穿透+4,吸血+5%。
  • metallurgy.adamantine(幽冥剧毒套装)
    • 造伤+40%。
    • 服务端玩家攻击目标时,使目标获得5秒3级的冰缓效果,无冷却时间。
  • metallurgy.atlarus()
  • 略……

依据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739

public static final void doEffectAttackKit(EntityPlayer player, AttackEffect data, boolean cantrigger, LivingHurtEvent event, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget) {
if (!cantrigger)
return;
ItemArmor.ArmorMaterial temp = isKit(player);
if (temp != null)
doEffectAttack(data, temp, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount);
}

public static ItemArmor.ArmorMaterial isKit(EntityPlayer player) {
ItemStack[] armor = player.field_71071_by.field_70460_b;
if (armor[0] != null && armor[1] != null && armor[2] != null && armor[3] != null &&
armor[0].func_77973_b() instanceof ItemArmor && armor[1].func_77973_b() instanceof ItemArmor && armor[2].func_77973_b() instanceof ItemArmor && armor[3].func_77973_b() instanceof ItemArmor) {
ItemArmor armors = (ItemArmor)armor[0].func_77973_b();
ItemArmor.ArmorMaterial ArmorMaterial = armors.func_82812_d();
if (armor[0].func_77973_b() instanceof ItemToolArmorLevel) {
ItemToolArmorLevel ital = (ItemToolArmorLevel)armor[0].func_77973_b();
ArmorMaterial = ital.getArmorMaterialID(armor[0].func_77960_j());
if (armor[1].func_77973_b() instanceof ItemToolArmorLevel && armor[2].func_77973_b() instanceof ItemToolArmorLevel && armor[3].func_77973_b() instanceof ItemToolArmorLevel && (
(ItemToolArmorLevel)armor[1].func_77973_b()).getArmorMaterialID(armor[1].func_77960_j()) == ArmorMaterial && ((ItemToolArmorLevel)armor[2].func_77973_b()).getArmorMaterialID(armor[2].func_77960_j()) == ArmorMaterial && ((ItemToolArmorLevel)armor[3].func_77973_b()).getArmorMaterialID(armor[3].func_77960_j()) == ArmorMaterial)
return ArmorMaterial;
return null;
}
if (((ItemArmor)armor[1].func_77973_b()).func_82812_d() == ArmorMaterial && ((ItemArmor)armor[2].func_77973_b()).func_82812_d() == ArmorMaterial && ((ItemArmor)armor[3].func_77973_b()).func_82812_d() == ArmorMaterial)
return ArmorMaterial;
}
return null;
}

public static final void doEffectAttack(AttackEffect data, ItemArmor.ArmorMaterial Material, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot root, ManaMetalModRoot rootTarget, DamageSource source, float damage) {
if (player.field_71071_by.field_70460_b[0].func_77973_b() instanceof ItemToolArmorSpecial) {
ArmorFXCore.doEffectAttack(data, Material, player, target, root, rootTarget, source, damage);
return;
}
if (Material.toString().equals("HighlycrystalArmor_1")) {
data.attack += 0.4F;
if (!player.field_70170_p.field_72995_K &&
target != null)
PotionEffectM3.removePotion(root, PotionM3.potionPoison);
}
if (Material.toString().equals("Adamantine_1")) {
addAllPower(data, 3, true);
data.attack += 0.7F;
data.hp_blood += 0.05F;
}
if (Material.toString().equals("Mithril_1")) {
addAllPower(data, 3, true);
data.attack += 0.6F;
data.hp_blood += 0.05F;
}
if (Material.toString().equals("SoulSteel_1")) {
addAllPower(data, 3, true);
data.attack += 0.5F;
data.hp_blood += 0.05F;
}
if (Material.toString().equals("MysteriousIron_1")) {
addAllPower(data, 3, true);
data.attack += 0.4F;
data.hp_blood += 0.05F;
}
if (Material.toString().equals("HolyCopper_1")) {
addAllPower(data, 3, true);
data.attack += 0.3F;
data.hp_blood += 0.05F;
}
if (Material.toString().equals("BloodDragonArmor_1")) {
if (player.func_110143_aJ() > player.func_110138_aP() * 0.9F) {
addAllPower(data, 5, true);
data.attack += 0.6F;
}
return;
}
if (Material == LapudaCore.MeteoriteArmor.ArmorMaterials[0]) {
addAllPower(data, 1, true);
if (player.func_110143_aJ() > player.func_110138_aP() * 0.9F)
data.attack += 0.2F;
return;
}
if (Material == LapudaCore.MeteoriteArmor.ArmorMaterials[1]) {
addAllPower(data, 2, true);
if (player.func_110143_aJ() > player.func_110138_aP() * 0.9F)
data.attack += 0.2F;
return;
}
if (Material == LapudaCore.MeteoriteArmor.ArmorMaterials[2]) {
addAllPower(data, 3, true);
if (player.func_110143_aJ() > player.func_110138_aP() * 0.9F)
data.attack += 0.2F;
return;
}
if (Material == LapudaCore.MeteoriteArmor.ArmorMaterials[3]) {
addAllPower(data, 4, true);
if (player.func_110143_aJ() > player.func_110138_aP() * 0.9F)
data.attack += 0.2F;
return;
}
if (Material.toString().equals("oceanArmor_1")) {
addAllPower(data, 0, true);
float damages = 0.04F;
data.attack += root.produce.getLV(Produce.Fishing) * damages;
return;
}
if (Material.toString().equals("farmArmor_1")) {
addAllPower(data, 0, true);
float damages = 0.04F;
data.attack += root.produce.getLV(Produce.Farmer) * damages;
return;
}
if (Material.toString().equals("BossStartDragonArmor_1")) {
addAllPower(data, 3, true);
data.attack += 0.4F;
}
if (Material.toString().equals("TempleArmor_1")) {
addAllPower(data, 1, true);
if (target != null) {
if (target instanceof net.minecraft.entity.boss.IBossDisplayData)
data.attack += 0.4F;
if (target instanceof IDungeonBoss) {
IDungeonBoss boss = (IDungeonBoss)target;
if (boss.isBoss())
data.attack += 0.4F;
}
}
return;
}
if (Material.toString().equals("StrongholdArmor_1")) {
if (player.func_110143_aJ() < player.func_110138_aP() * 0.5F) {
addAllPower(data, 4, true);
data.attack += 0.8F;
}
return;
}
if (Material.toString().equals("ShadowSecretGold_1")) {
addAllPower(data, 0, true);
float damages = 0.04F;
data.attack += root.produce.getLV(Produce.Mining) * damages;
return;
}
if (Material.toString().equals("FeatherSnakeArmor_1")) {
addAllPower(data, 2, true);
if (!player.field_70170_p.field_72995_K)
PotionEffectM3.addPotion((EntityLivingBase)player, PotionM3.potionWhiteSnake, 10, 0);
return;
}
if (Material.toString().equals("DungeonGolden_1")) {
addAllPower(data, 2, true);
if (!player.field_70170_p.field_72995_K &&
player.field_71071_by.func_146026_a(Items.field_151043_k)) {
data.attack += 0.6F;
data.penetration_base += 4;
}
return;
}
if (Material == WeaponCore.bedrock_level_1.ArmorMaterials[1]) {
addAllPower(data, 1, true);
return;
}
if (Material == WeaponCore.bedrock_level_1.ArmorMaterials[2]) {
data.attack += 0.25F;
data.crit += 8;
return;
}
if (Material == WeaponCore.bedrock_level_1.ArmorMaterials[3]) {
data.hp_blood += 0.05F;
return;
}
if (Material == WeaponCore.bedrock_level_2.ArmorMaterials[1]) {
addAllPower(data, 3, true);
return;
}
if (Material == WeaponCore.bedrock_level_2.ArmorMaterials[2]) {
data.attack += 0.35F;
data.crit += 8;
return;
}
if (Material == WeaponCore.bedrock_level_2.ArmorMaterials[3]) {
data.hp_blood += 0.1F;
return;
}
if (Material == LegendaryWeaponCore.Bear) {
data.xp += 0.1F;
return;
}
if (Material == LegendaryWeaponCore.Falcon) {
data.crit += 15;
data.xp += 0.1F;
return;
}
if (Material == LegendaryWeaponCore.Fox) {
data.penetration_base += 5;
data.xp += 0.1F;
return;
}
if (Material == LegendaryWeaponCore.Wolf) {
data.attack += 0.15F;
data.xp += 0.1F;
return;
}
if (Material == UndeadGraveCore.ArmorM1) {
data.attack += 0.1F;
data.hp_blood += 0.05F;
return;
}
if (Material == UndeadGraveCore.ArmorM2) {
data.attack += 0.2F;
data.crit += 7;
return;
}
if (Material == UndeadGraveCore.ArmorM3) {
data.attack += 0.1F;
data.crit += 5;
if (!player.field_70170_p.field_72995_K)
root.mana.addPower(15);
return;
}
if (Material == WeaponCore.legend_ore.ArmorMaterials[0]) {
addAllPower(data, 0, true);
return;
}
if (Material == WeaponCore.legend_ore.ArmorMaterials[1]) {
addAllPower(data, 1, true);
return;
}
if (Material == WeaponCore.legend_ore.ArmorMaterials[2]) {
addAllPower(data, 2, true);
return;
}
if (Material == WeaponCore.legend_ore.ArmorMaterials[3]) {
addAllPower(data, 3, true);
return;
}
if (Material == WeaponCore.epic_ore.ArmorMaterials[0]) {
data.attack += 0.1F;
data.crit += 3;
return;
}
if (Material == WeaponCore.epic_ore.ArmorMaterials[1]) {
data.attack += 0.15F;
data.crit += 5;
return;
}
if (Material == WeaponCore.epic_ore.ArmorMaterials[2]) {
data.attack += 0.2F;
data.crit += 7;
return;
}
if (Material == WeaponCore.epic_ore.ArmorMaterials[3]) {
data.attack += 0.25F;
data.crit += 9;
return;
}
if (Material == ItemArmor.ArmorMaterial.GOLD) {
data.attack += 0.3F;
return;
}
if (Material == ItemArmor.ArmorMaterial.CHAIN) {
data.attack += 0.15F;
data.penetration_base += 3;
return;
}
if (Material == ManaMetalMod.ArmorKnight) {
data.crit += 5;
data.penetration_base += 2;
}
if (Material == ItemArmor.ArmorMaterial.DIAMOND) {
data.attack += 0.1F;
if (!player.field_70170_p.field_72995_K)
PotionEffectM3.addPotion(target, PotionM3.potionBadArmor, 10, 0);
return;
}
if (Material == WeaponCore.BloodMetal.armorMaterial) {
data.hp_blood += 0.1F;
return;
}
if (Material == WeaponCore.Dark.armorMaterial) {
if (player.func_110143_aJ() < player.func_110138_aP() * 0.3F)
data.attack += 0.35F;
return;
}
if (Material == WeaponCore.AncientThulium.armorMaterial) {
if (target == root.carrer.lastAttackTarget)
data.attack += 0.2F;
return;
}
if (Material == WeaponCore.ManaS.armorMaterial) {
if (!player.field_70170_p.field_72995_K)
root.mana.addPower(20);
return;
}
if (Material == WeaponCore.UniverseEnergy.armorMaterial) {
data.attack += 0.2F;
data.crit += 5;
return;
}
if (Material == WeaponCore.NeutronEnergy.armorMaterial) {
data.attack += 0.1F;
return;
}
if (Material == WeaponCore.Endless.armorMaterial) {
if (root.mana.getMana() > root.mana.getMagicMax() * 0.5D)
data.attack += 0.25F;
return;
}
if (Material == WeaponCore.Crimson.armorMaterial) {
if (player.func_110143_aJ() >= player.func_110138_aP())
data.attack += 0.35F;
return;
}
if (Material == WeaponCore.Cobalt.armorMaterial) {
data.attack += 0.15F;
return;
}
if (Material == WeaponCore.Palladium.armorMaterial) {
data.hp_blood += 0.05F;
return;
}
if (Material == WeaponCore.RuneSteel.armorMaterial) {
addAllPower(data, 0, true);
return;
}
if (Material == WeaponCore.TrueAncientThulium.armorMaterial) {
data.attack += 0.2F;
data.hp_blood += 0.05F;
return;
}
if (Material.toString().equals("armor_Titanium_1")) {
addAllPower(data, 1, true);
return;
}
if (Material.toString().equals("armor_Lead_1")) {
data.attack += 0.1F;
data.critDamage += 0.1F;
return;
}
if (Material.toString().equals("goldSteeleafIngotArmor_1")) {
addAllPower(data, 1, true);
if (target instanceof net.minecraft.entity.boss.IBossDisplayData)
data.attack += 0.2F;
return;
}
if (Material.toString().equals("powerIronwoodIngotArmor_1")) {
addAllPower(data, 1, true);
data.hp_blood += 0.05F;
return;
}
if (Material.toString().equals("FIERY")) {
if (target.func_70027_ad())
data.attack += 0.35F;
return;
}
if (Material.toString().equals("KNIGHTMETAL")) {
if (player.func_70115_ae())
data.attack += 0.5F;
return;
}
if (Material.toString().equals("KNIGHTPHANTOM")) {
addAllPower(data, 2, true);
data.hp_blood += 0.1F;
return;
}
if (Material.toString().equals("YETI")) {
addAllPower(data, 2, true);
if (!player.field_70170_p.field_72995_K &&
target != null)
target.func_70690_d(new PotionEffect(2, 200, 1));
return;
}
if (Material.toString().equals("ARCTIC")) {
addAllPower(data, 1, true);
return;
}
if (Material.toString().equals("CompressionSteelArmor_1")) {
data.attack += 0.2F;
data.hp_blood += 0.1F;
return;
}
if (MMM.isThaumcraft) {
if (Material.toString().equals("MisriruArmorMaterial")) {
data.attack += 0.35F;
return;
}
if (Material.toString().equals("MisriruArmorMaterialTrue")) {
data.attack += 0.5F;
data.hp_blood += 0.15F;
return;
}
if (Material.toString().equals("SPECIAL")) {
data.attack += 0.2F;
data.penetration_base += 2;
return;
}
if (Material.toString().equals("VOID")) {
data.attack += 0.2F;
data.penetration_base += 4;
data.hp_blood += 0.1F;
return;
}
if (Material.toString().equals("FORTRESS")) {
data.attack += 0.3F;
data.hp_blood += 0.1F;
return;
}
}
if (MMM.isBotania) {
if (Material.toString().equals("MANASTEEL")) {
if (root.mana.getMana() >= root.mana.getMagicMax() * 0.5F) {
data.attack += 0.2F;
data.penetration_base += 5;
}
return;
}
if (Material.toString().equals("TERRASTEEL")) {
data.attack += 0.3F;
data.hp_blood += 0.1F;
return;
}
if (Material.toString().equals("B_ELEMENTIUM")) {
if (root.mana.getMana() < root.mana.getMagicMax() * 0.8F) {
data.attack += 0.3F;
data.penetration_base += 5;
}
return;
}
if (Material.toString().equals("MANAWEAVE")) {
data.attack += 0.1F;
data.penetration_base += 2;
root.mana.addPower(50);
return;
}
}
if (MMM.isMoCreatures) {
if (Material.toString().equals("crocARMOR")) {
data.attack += 0.25F;
if (!player.field_70170_p.field_72995_K &&
target != null)
target.func_70690_d(new PotionEffect(2, 100, 1));
return;
}
if (Material.toString().equals("furARMOR")) {
data.attack += 0.2F;
return;
}
if (Material.toString().equals("hideARMOR")) {
data.attack += 0.2F;
data.penetration_base += 4;
return;
}
}
if (MMM.isAether) {
if (Material.toString().equals("Armor_Zanite")) {
data.attack += 0.1F;
data.penetration_base += 2;
return;
}
if (Material.toString().equals("Armor_Gravitite")) {
if (!player.field_70122_E)
data.attack += 0.6F;
return;
}
if (Material.toString().equals("Armor_Neptune")) {
if (player.func_70090_H()) {
data.attack += 0.65F;
data.penetration_base += 8;
}
return;
}
if (Material.toString().equals("Armor_Phoenix")) {
if (!player.field_70170_p.field_72995_K &&
target != null) {
target.func_70015_d(10);
if (target.func_70027_ad())
data.attack += 0.9F;
}
return;
}
if (Material.toString().equals("Armor_Obsidian")) {
data.penetration_base += 11;
data.hp_blood += 0.1F;
return;
}
if (Material.toString().equals("Armor_Valkyrie")) {
data.attack += 0.3F;
data.penetration_base += 5;
data.hp_blood += 0.1F;
return;
}
}
if (MMM.isChocolateQuest) {
if (Material.toString().equals("CQ_dragon")) {
data.attack += 0.6F;
data.penetration_base += 9;
}
if (Material.toString().equals("CQ_king")) {
data.attack += 0.3F;
data.hp_blood += 0.1F;
}
if (Material.toString().equals("TURTLE")) {
data.hp_blood += 0.1F;
if (!player.field_70170_p.field_72995_K) {
PotionEffectM3.addPotion(root, PotionM3.potionbrewing3, 200, 0);
PotionEffectM3.addPotion(root, PotionM3.potionResistance2, 200, 0);
}
}
if (Material.toString().equals("MONSTER_FUR")) {
data.attack += 0.3F;
if (!player.field_70170_p.field_72995_K &&
target != null)
try {
target.func_70690_d(new PotionEffect(2, 100, 1));
} catch (Exception e) {
e.printStackTrace();
}
}
if (Material.toString().equals("CQ_bull"))
data.attack_base += root.defe.getDefe() + ToolCore.getPlayerArmorDefense(player);
if (Material.toString().equals("CQ_slime") &&
!player.field_70170_p.field_72995_K) {
if (player.field_71071_by.func_146026_a(Items.field_151123_aH))
data.attack += 0.7F;
if (player.field_70170_p.field_73012_v.nextInt(5) == 0)
MMM.addItemToPlayer(Items.field_151123_aH, player);
}
if (Material.toString().equals("CQ_mage")) {
data.attack += 0.1F;
if (!player.field_70170_p.field_72995_K)
root.mana.addPower(60);
}
}
if (MMM.isMetallurgy) {
if (Material.toString().equals("metallurgy.tartarite")) {
data.attack += 0.5F;
data.penetration_base += 4;
data.hp_blood += 0.05F;
return;
}
if (Material.toString().equals("metallurgy.adamantine")) {
data.attack += 0.4F;
if (!player.field_70170_p.field_72995_K &&
target != null)
try {
target.func_70690_d(new PotionEffect(2, 100, 2));
} catch (Exception e) {
e.printStackTrace();
}
return;
}
if (Material.toString().equals("metallurgy.atlarus")) {
data.attack += 0.4F;
if (!player.field_70170_p.field_72995_K &&
target != null &&
target.func_70027_ad())
data.attack += 0.2F;
return;
}
if (Material.toString().equals("metallurgy.sanguinite")) {
data.attack += 0.4F;
data.penetration_base += 4;
return;
}
if (Material.toString().equals("metallurgy.celenegil")) {
if (!player.field_70170_p.field_72995_K &&
player.func_82165_m(19))
data.attack += 0.7F;
return;
}
if (Material.toString().equals("metallurgy.orichalcum")) {
if (!player.field_70170_p.field_72995_K &&
root.mana.getMana() > root.mana.getMagicMax() * 0.5F)
data.attack += 0.5F;
return;
}
if (Material.toString().equals("metallurgy.vulcanite")) {
if (!player.field_70170_p.field_72995_K &&
player.func_70027_ad())
data.attack += 0.7F;
return;
}
if (Material.toString().equals("metallurgy.mithril") || Material.toString().equals("metallurgy.carmot") || Material.toString().equals("metallurgy.kalendrite")) {
data.attack += 0.3F;
data.penetration_base += 2;
return;
}
if (Material.toString().equals("metallurgy.oureclase") || Material.toString().equals("metallurgy.midasium") || Material.toString().equals("metallurgy.vyroxeres") || Material.toString().equals("metallurgy.ceruclase")) {
data.attack += 0.2F;
data.penetration_base += 2;
return;
}
}
if (Material.toString().equals("candyarmormaterial")) {
data.attack += 0.2F;
if (!player.field_70170_p.field_72995_K &&
target != null)
try {
target.func_70690_d(new PotionEffect(2, 100, 2));
} catch (Exception e) {
e.printStackTrace();
}
return;
}
if (Material.toString().equals("TofuMetalSuperArmorMaterial")) {
Item item = GameRegistry.findItem("TofuCraft", "tofuKinu");
if (item != null &&
player.field_71071_by.func_146028_b(item)) {
if (!player.field_70170_p.field_72995_K &&
player.field_70170_p.field_73012_v.nextInt(10) == 0)
player.field_71071_by.func_146026_a(item);
data.attack += 0.4F;
data.penetration_base += 5;
}
return;
}
if (Material.toString().equals("ICHOR")) {
data.attack += 0.5F;
data.penetration_base += 8;
data.hp_blood += 0.05F;
return;
}
}

public static final void addAllPower(AttackEffect data, int type, boolean isAttack) {
if (isAttack) {
switch (type) {
case 0:
data.attack += 0.15F;
data.crit += 4;
data.penetration_base++;
data.final_attack += 0.01F;
return;
case 1:
data.attack += 0.2F;
data.crit += 6;
data.penetration_base += 2;
data.final_attack += 0.02F;
return;
case 2:
data.attack += 0.25F;
data.crit += 8;
data.penetration_base += 3;
data.final_attack += 0.03F;
return;
case 3:
data.attack += 0.3F;
data.crit += 10;
data.penetration_base += 4;
data.final_attack += 0.04F;
return;
case 4:
data.attack += 0.35F;
data.crit += 12;
data.penetration_base += 5;
data.final_attack += 0.05F;
return;
case 5:
data.attack += 0.4F;
data.crit += 14;
data.penetration_base += 6;
data.final_attack += 0.06F;
return;
case 6:
data.attack += 0.45F;
data.crit += 16;
data.penetration_base += 7;
data.final_attack += 0.07F;
return;
case 7:
data.attack += 0.5F;
data.crit += 18;
data.penetration_base += 8;
data.final_attack += 0.08F;
return;
case 8:
data.attack += 0.55F;
data.crit += 20;
data.penetration_base += 9;
data.final_attack += 0.09F;
return;
case 9:
data.attack += 0.6F;
data.crit += 22;
data.penetration_base += 10;
data.final_attack += 0.01F;
return;
case 10:
data.attack += 0.65F;
data.crit += 24;
data.penetration_base += 11;
data.final_attack += 0.11F;
return;
}
} else {
switch (type) {
case 0:
data.avoid += 4;
data.defense += 8;
return;
case 1:
data.avoid += 6;
data.defense += 12;
return;
case 2:
data.avoid += 8;
data.defense += 16;
return;
case 3:
data.avoid += 10;
data.defense += 20;
return;
case 4:
data.avoid += 12;
data.defense += 24;
return;
case 5:
data.avoid += 14;
data.defense += 32;
return;
case 6:
data.avoid += 16;
data.defense += 36;
return;
case 7:
data.avoid += 18;
data.defense += 40;
return;
case 8:
data.avoid += 20;
data.defense += 44;
return;
case 9:
data.avoid += 22;
data.defense += 48;
return;
case 10:
data.avoid += 24;
data.defense += 52;
return;
}
}
}

依据-毕业套效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
public static final int isArmorFullLV(EntityPlayer player) {
ItemStack[] armor = player.field_71071_by.field_70460_b;
if (armor[0].func_77973_b() instanceof ItemToolArmorSpecial && armor[1].func_77973_b() instanceof ItemToolArmorSpecial && armor[2].func_77973_b() instanceof ItemToolArmorSpecial && armor[3].func_77973_b() instanceof ItemToolArmorSpecial &&
getType(armor[0]) == getType(armor[1]) && getType(armor[0]) == getType(armor[2]) && getType(armor[0]) == getType(armor[3]))
return findMin(new int[] { getLV(armor[0]), getLV(armor[1]), getLV(armor[2]), getLV(armor[3]) });
return -1;
}


public static final void doEffectAttack(AttackEffect data, ItemArmor.ArmorMaterial Material, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot root, ManaMetalModRoot rootTarget, DamageSource source, float damage) {
if (player.field_71071_by.field_70460_b[0].func_77973_b() instanceof ItemToolArmorSpecial) {
int LV = ItemToolArmorSpecial.isArmorFullLV(player);
if (LV > -1) {
int type = ItemToolArmorSpecial.getType(player.field_71071_by.field_70460_b[0]);
if (Material.toString().equals("DefendGuard_1")) {
if (type == 1) {
if (LV >= 5) {
data.defense += 75;
data.defense = (int)(data.defense + root.defe.getDefe() * 0.05D);
}
if (LV >= 15) {
data.defense = (int)(data.defense + root.defe.getDefe() * 0.15D);
data.damage_reduce += 0.1F;
}
if (LV >= 30 &&
root.carrer.armorCD_3 == 0) {
PotionEffectM3.addPotionUpLV(root, PotionM3.potionASP_d2, 7, 5);
root.carrer.armorCD_3 = 2;
}
if (LV >= 35) {
data.defense = (int)(data.defense + root.defe.getDefe() * 0.2D);
data.damage_reduce += 0.15F;
}
if (LV >= 40) {
data.defense -= 400;
int temp = data.defense + root.defe.getDefe() + ToolCore.getPlayerArmorDefense(player);
if (temp > 0) {
int attack = (int)(0.4D * temp);
data.attack_base += attack;
}
}
}
if (type == 2 || type == 0) {
if (LV >= 5) {
data.defense += 50;
data.damage_reduce += 0.05F;
}
if (LV >= 15) {
data.defense = (int)(data.defense + root.defe.getDefe() * 0.1D);
data.damage_reduce += 0.1F;
}
if (LV >= 30 &&
root.carrer.armorCD_3 == 0) {
root.carrer.armorCD_3 = 2;
PotionEffectM3.addPotionUpLV(root, PotionM3.potionASP_d6, 7, 5);
}
if (LV >= 35)
data.defense = (int)(data.defense + root.defe.getDefe() * 0.2D);
}
return;
}
if (Material.toString().equals("WraithReaper_1")) {
if (target != null &&
target.func_110143_aJ() < target.func_110138_aP() * 0.5F) {
data.attack += 0.3F;
data.penetration_base += 4;
}
if (type == 1) {
if (LV >= 5) {
data.attack += 0.1F;
data.critDamage += 0.05F;
}
if (LV >= 10)
PotionEffectM3.addPotionUpLV(rootTarget, PotionM3.potionASP_r1, 10, 100);
if (LV >= 15) {
data.attack += 0.15F;
data.critDamage += 0.1F;
}
if (LV >= 20) {
data.attack += 0.07F;
data.critDamage += 0.05F;
if (root.carrer.armorCD_1 == 0) {
PotionEffectM3.addPotionUpLV(root, PotionM3.potionASP_r2, 5, 5);
root.carrer.armorCD_1 = 2;
}
}
if (LV >= 25) {
data.attack += 0.2F;
data.critDamage += 0.15F;
}
if (LV >= 30 &&
root.carrer.armorCD_2 == 0) {
PotionEffectM3.addPotionList(MMM.findMobs((Entity)player, 11.0D), PotionM3.potionASP_r3, 5, 0);
root.carrer.armorCD_2 = 5;
}
if (LV >= 35 &&
PotionEffectM3.isPotion(rootTarget, PotionM3.potionASP_r3))
data.critDamage += 0.5F;
if (LV >= 40) {
data.final_attack += 0.25F;
data.attack += 0.25F;
data.critDamage += 0.5F;
}
if (LV >= 45) {
int datacount = PotionEffectM3.isPotion(MMM.findMobs((Entity)player, 6.0D), new PotionM3[] { PotionM3.potionASP_r3 });
if (datacount > 0) {
data.attack += datacount * 0.05F;
data.critDamage += datacount * 0.03F;
}
}
}
if (type == 2 || type == 0) {
if (LV >= 5)
data.attack_base += 18;
if (LV >= 10 &&
MMM.isEntityBoss((Entity)target))
data.attack += 0.1F;
if (LV >= 15)
data.attack_base += 36;
if (LV >= 20 &&
player.field_70170_p.field_73012_v.nextInt(10) == 0) {
int LVpp = PotionEffectM3.addPotionUpLV(root, PotionM3.potionASP_r7, 16, 10);
if (LVpp >= 10 &&
MMM.isEntityBoss((Entity)target))
data.attack += 0.2F;
}
if (LV >= 25 &&
!target.field_70170_p.field_72995_K &&
target.func_110143_aJ() < target.func_110138_aP() * 0.5F &&
MMM.isEntityBoss((Entity)target))
data.attack += 0.3F;
if (LV >= 30 &&
MMM.isEntityBoss((Entity)target) &&
target.func_110143_aJ() < target.func_110138_aP() * 0.5F) {
PotionEffectM3.addPotion(rootTarget, PotionM3.potionASP_r8, 7, 0);
data.attack += 0.2F;
data.critDamage += 0.1F;
}
if (LV >= 35)
if (MMM.isEntityBoss((Entity)target)) {
data.attack += 0.75F;
} else {
data.attack -= 0.5F;
}
if (LV >= 40 &&
PotionEffectM3.isPotion(rootTarget, PotionM3.potionASP_r8))
PotionEffectM3.addPotion(root, PotionM3.potionASP_r9, 7, 0);
if (LV >= 45) {
if (PotionEffectM3.isPotion(rootTarget, PotionM3.potionASP_r8))
PotionEffectM3.addPotionUpLV(rootTarget, PotionM3.potionASP_r10, 6, 10);
if (PotionEffectM3.isPotion(root, PotionM3.potionASP_r9) &&
PotionEffectM3.isPotion(rootTarget, PotionM3.potionASP_r10))
data.final_attack += 0.1F;
}
if (LV >= 50 &&
!player.field_70170_p.field_72995_K &&
!target.field_70128_L && PotionEffectM3.isPotion(rootTarget, PotionM3.potionASP_r10) && !PotionEffectM3.isPotion(rootTarget, PotionM3.potionInvincible)) {
float hpdata = 0.01F;
if (target.func_110143_aJ() < target.func_110138_aP() * hpdata)
target.func_70606_j(1.0F);
}
}
return;
}
if (Material.toString().equals("SecretMagic_1")) {
if (root.mana.getMana() > root.mana.getMagicMax() * 0.9F) {
data.attack += 0.3F;
data.penetration_base += 4;
}
if (type == 1) {
if (LV >= 5) {
data.attack += 0.12F;
root.mana.magicReliefTemp += 0.01F;
}
if (LV >= 10)
data.attack += 0.2F;
if (LV >= 15) {
data.attack += 0.16F;
root.mana.magicReliefTemp += 0.02F;
}
if (LV >= 25) {
data.attack += 0.24F;
root.mana.magicReliefTemp += 0.04F;
}
if (LV >= 30)
data.no_tack_damage += (int)(root.mana.getMagicMax() * 0.32F);
if (LV >= 35 &&
PotionEffectM3.getPotionLV(root, PotionM3.potionASP_m1) >= 5) {
data.final_attack += 0.1F;
data.critDamage += 0.15F;
}
if (LV >= 40) {
int max = (int)(root.mana.getMagicMax() * 0.3F);
PotionEffectM3.addPotionUpLVData(root, PotionM3.potionASP_m4, 15, (int)(damage * 0.03F + 1.0F), max);
}
if (LV >= 45) {
int max = (int)(root.mana.getMagicMax() * 0.3F);
if (PotionEffectM3.isPotion(root, PotionM3.potionASP_m4)) {
data.attack += 0.35F;
data.crit += 30;
data.critDamage += 0.1F;
root.mana.addPower((int)(damage * 0.03F));
}
}
}
if (type == 2 || type == 0) {
if (LV >= 5) {
root.mana.addPower((int)(damage * 0.001F));
root.mana.magicReliefTemp += 0.01F;
}
if (LV >= 10 &&
root.carrer.armorCD_1 == 0) {
root.carrer.armorCD_1 = 45;
int max = (int)(root.mana.getMagicMax() * 0.15F);
PotionEffectM3.addPotion(root, PotionM3.potionASP_m4, 45, max);
}
if (LV >= 15) {
root.mana.addPower((int)(damage * 0.001F));
root.mana.magicReliefTemp += 0.02F;
}
if (LV >= 25) {
root.mana.addPower((int)(damage * 0.002F));
root.mana.magicReliefTemp += 0.04F;
}
if (LV >= 30)
data.no_tack_damage += (int)(root.mana.getMagicMax() * 0.32F);
if (LV >= 35 &&
PotionEffectM3.isPotion(root, PotionM3.potionASP_m4)) {
data.attack += 0.2F;
data.critDamage += 0.15F;
data.crit += 15;
data.avoid += 15;
}
if (LV >= 50 &&
!PotionEffectM3.isPotion(root, PotionM3.potionASP_m9))
PotionEffectM3.addPotionUpLV(root, PotionM3.potionASP_m8, 7, 20);
}
}
if (Material.toString().equals("EternalSpirit_1")) {
if (type == 1) {
if (LV >= 5)
data.hp_blood += 0.02F;
if (LV >= 10 &&
root.carrer.armorCD_3 == 0) {
root.carrer.armorCD_3 = 2;
int ppLV = PotionEffectM3.addPotionUpLV(target, PotionM3.potionASP_f2, 10, 10);
if (ppLV >= 10) {
data.hp_blood += 0.05F;
float hpdata = 0.01F;
if (MMM.isEntityBoss((Entity)target)) {
hpdata = 0.001F;
} else if (target instanceof IDungeonBoss) {
IDungeonBoss IDungeonBoss = (IDungeonBoss)target;
if (IDungeonBoss.isBoss())
hpdata = 0.001F;
}
data.no_tack_damage += target.func_110138_aP() * hpdata;
}
}
if (LV >= 15)
data.hp_blood += 0.04F;
if (LV >= 20) {
PotionEffectM3.addPotion(root, PotionM3.potionASP_f0, 20, 0);
data.attack += 0.35F;
data.critDamage += 0.1F;
}
if (LV >= 25 &&
root.carrer.armorCD_1 == 0) {
root.carrer.armorCD_1 = 3;
PotionEffectM3.addPotionUpLV(root, PotionM3.potionASP_f1, 20, 5);
if (M3Config.UseBloodSystem &&
root.carrer.bloodData > 0) {
int reblood = (int)(player.func_110138_aP() * 0.05F);
root.carrer.addBloodData(reblood);
}
}
if (LV >= 30 &&
player.func_110143_aJ() > player.func_110138_aP() * 0.9F) {
data.final_attack += 0.1F;
data.critDamage += 0.2F;
}
if (LV >= 40 &&
player.func_110143_aJ() < player.func_110138_aP() * 0.7F)
data.hp_blood += 0.04F;
if (LV >= 45) {
int ppLV = PotionEffectM3.addPotionUpLV(root, PotionM3.potionASP_f5, 5, 10);
if (ppLV >= 10)
data.final_attack += 0.1F;
data.attack = (float)(data.attack + 0.04D * ppLV);
}
}
if (type == 2 || type == 0) {
if (LV >= 20)
data.no_tack_damage += player.func_110138_aP() * 0.16F;
if (LV >= 25 &&
!root.carrer.hasDamage())
data.no_tack_damage += player.func_110138_aP() * 0.32F;
if (LV >= 30)
if (player.func_110143_aJ() >= player.func_110138_aP() * 0.5F) {
data.attack += 0.3F;
PotionEffectM3.addPotion(root, PotionM3.potionASP_f7, 20, 0);
} else {
PotionEffectM3.addPotion(root, PotionM3.potionASP_f8, 20, 0);
}
if (LV >= 50 &&
root.carrer.armorCD_1 == 0) {
root.carrer.armorCD_1 = 2;
int ppLV = PotionEffectM3.addPotionUpLV(root, PotionM3.potionASP_f9, 7, 5);
if (ppLV >= 5)
data.no_tack_damage += player.func_110138_aP() * 0.64F;
}
}
}
}
}
}

1
WeaponEffect.doEffectAttack(data, MMM.getWeaponToolMaterial(item), player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount, cantrigger, item);

武器额外属性

  • 判断是否可以触发攻击(cantrigger),并且有材质(Material)
  • 应用ItemCustomizeTools效果,若NBT中存在名为”IItemCustomizeTag”的键,根据其值(id)给予不同的效果
    • 在百科中为“额外属性”,参考
    • id == -1 : 无效果
    • id == 0 : 造伤+10%,穿透+3
    • id == 1 : 造伤+15%,穿透+2
    • id == 2 : 造伤+20%,穿透+1
    • id == 3 : 吸血+2%
    • id == 4 : 造伤+10%,穿透+1,暴击率+5
    • id == 5 : 造伤+15%,穿透+1,暴击率+6
    • id == 6 : 造伤+20%,穿透+1,暴击率+7
    • id == 7 : 生命值高于一半时,造伤+35%
    • id == 8 : 魔力值高于一半时,造伤+35%
    • id == 9 : 吸血+4%
  • 若材料为HolySoul(圣魂),且目标单位为ILegendEntity(阿斯翠德、真马、神艾),造伤+40%
  • 若材料为Astrid,且玩家当前生命未满时,造伤+40%,穿透+3
  • 若材料为Paganism,玩家恢复24点生命
  • 若材料为Pirate(海盗),暴击率+10
  • 若材料为Luna,爆伤+20%,穿透+2
  • 若物品所属Mod为Botania、Thaumcraft、ProjectE,应用各自联动Mod的武器效果
依据-武器效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public static final void doEffectAttack(AttackEffect data, Item.ToolMaterial Material, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, DamageSource source, float damage, boolean cantrigger, ItemStack weapon) {
if (!cantrigger || Material == null)
return;
ItemCustomizeTools.weaponEffect(data, Material, player, target, rootPlayer, rootTarget, source, damage, cantrigger, weapon);
if (Material == ThuliumEmpireCore.HolySoul.toolMaterial &&
target != null && !target.field_70170_p.field_72995_K &&
target instanceof project.studio.manametalmod.api.ILegendEntity)
data.attack += 0.4F;
if (Material == WeaponCore.Astrid.toolMaterial &&
player.func_110143_aJ() < player.func_110138_aP()) {
data.penetration_base += 3;
data.attack += 0.4F;
return;
}
if (Material == WeaponCore.Paganism.toolMaterial) {
player.func_70691_i(24.0F);
return;
}
if (Material == WeaponCore.Pirate.toolMaterial) {
data.crit += 10;
return;
}
if (Material == WeaponCore.Luna.toolMaterial) {
data.critDamage += 0.2F;
data.penetration_base += 2;
return;
}
if (MMM.isBotania &&
BotaniaWeaponCore.weaponEffect(data, Material, player, target, rootPlayer, rootTarget, source, damage, cantrigger))
return;
if (MMM.isThaumcraft &&
ThaumWeaponCore.weaponEffect(data, Material, player, target, rootPlayer, rootTarget, source, damage, cantrigger))
return;
if (MMM.isProjectE &&
ProjectECore.weaponEffect(data, Material, player, target, rootPlayer, rootTarget, source, damage, cantrigger))
return;
}
依据-ItemCustomizeTools效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
ItemCustomizeTools.weaponEffect(data, Material, player, target, rootPlayer, rootTarget, source, damage, cantrigger, weapon);

public static final void weaponEffect(AttackEffect data, Item.ToolMaterial Material, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, DamageSource source, float damage, boolean cantrigger, ItemStack weapon) {
int id = getIItemCustomizeTag(weapon);
if (id > -1)
switch (id) {
case 0:
data.attack += 0.1F;
data.penetration_base += 3;
break;
case 1:
data.attack += 0.15F;
data.penetration_base += 2;
break;
case 2:
data.attack += 0.2F;
data.penetration_base++;
break;
case 3:
data.hp_blood += 0.02F;
break;
case 4:
data.attack += 0.1F;
data.penetration_base++;
data.crit += 5;
break;
case 5:
data.attack += 0.15F;
data.penetration_base++;
data.crit += 6;
break;
case 6:
data.attack += 0.2F;
data.penetration_base++;
data.crit += 7;
break;
case 7:
if (player.func_110143_aJ() > player.func_110138_aP() * 0.5F)
data.attack += 0.35F;
break;
case 8:
if (rootPlayer.mana.getMana() > rootPlayer.mana.getMagicMax() * 0.5F)
data.attack += 0.35F;
break;
case 9:
data.hp_blood += 0.04F;
break;
}
}

public static final int getIItemCustomizeTag(ItemStack item) {
if (item.func_77942_o() && // 1. 检查物品堆叠(ItemStack)是否包含 NBT 数据
item.func_77978_p().func_150297_b("IItemCustomizeTag", 3)) // 2. 检查 NBT 中是否存在名为 "IItemCustomizeTag" 的键,且类型为3(Type 3)
return item.func_77978_p().func_74762_e("IItemCustomizeTag"); // 3. 如果存在,则返回这个整数值
return -1; // 4. 如果没有该标签,则统一返回 -1
}
联动Mod武器效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class BotaniaWeaponCore {
public static final boolean weaponEffect(AttackEffect data, Item.ToolMaterial Material, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, DamageSource source, float damage, boolean cantrigger) {
if (Material == BotaniaCore.ultimateTerrasteelTool.toolMaterial &&
ManaItemHandler.requestManaExactForTool(BotaniaCore.ItemManaEffectsData, player, 100, true)) {
data.attack += 0.4F;
return true;
}
if (Material == BotaniaCore.GaiaTool.toolMaterial &&
ManaItemHandler.requestManaExactForTool(BotaniaCore.ItemManaEffectsData, player, 400, true)) {
data.attack += 0.5F;
data.penetration_base += 5;
data.hp_blood += 0.05F;
return true;
}
return false;
}
}

public class ThaumWeaponCore {
public static final boolean weaponEffect(AttackEffect data, Item.ToolMaterial Material, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, DamageSource source, float damage, boolean cantrigger) {
if (Material == ThaumcraftCore2.Misriru.toolMaterial) {
if (WandManager.consumeVisFromInventory(player, (new AspectList()).add(Aspect.FIRE, 1)))
data.attack += 0.3F;
if (WandManager.consumeVisFromInventory(player, (new AspectList()).add(Aspect.EARTH, 1))) {
data.crit += 4;
data.penetration_base += 4;
}
return true;
}
return false;
}
}

public class ProjectECore {
public static final boolean weaponEffect(AttackEffect data, Item.ToolMaterial Material, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, DamageSource source, float damage, boolean cantrigger) {
if (Material == AntimatterEMC.toolMaterial) {
if (target instanceof EntityPlayer) {
EntityPlayer tp = (EntityPlayer)target;
for (int s = 0; s < tp.field_71071_by.field_70460_b.length; s++) {
if (tp.field_71071_by.field_70460_b[s] != null && (
tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.gemChest || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.gemFeet || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.gemHelmet || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.gemLegs || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.rmChest || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.rmFeet || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.rmHelmet || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.rmLegs || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.dmChest || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.dmFeet || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.dmHelmet || tp.field_71071_by.field_70460_b[s].func_77973_b() == ObjHandler.dmLegs))
tp.field_71071_by.field_70460_b[s] = null;
}
}
return true;
}
return false;
}
}


1
EventSpecialization.doEffectAttack(data, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount, cantrigger, attackType);

武士专精

  • 若职业为武士
    • 检查专精ID 61、69、70 是否点亮,每个增加10%造伤
    • 检查专精左上角是否点亮,减少25%终伤
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class EventSpecialization {
public static final void doEffectAttack(AttackEffect data, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot root, ManaMetalModRoot rootTarget, DamageSource source, float damage, boolean cantrigger, WeaponType attackType) {
if (!cantrigger)
return;
switch (attackType) {
case Samurai:
addDamage(61, data, root);
addDamage(69, data, root);
addDamage(70, data, root);
break;
case null:
addDamage(15, data, root);
addDamage(16, data, root);
addDamage(25, data, root);
break;
case null:
addDamage(55, data, root);
addDamage(64, data, root);
addDamage(65, data, root);
break;
}
switch (CareerCore.getPlayerCarrer(root)) {
case Samurai:
if (root.specialization.getMainEffect(NbtSpecialization.MainSpecialization.upperLeft))
data.final_attack -= 0.25F;
break;
}
}

public static final void addDamage(int target, AttackEffect data, ManaMetalModRoot root) {
if (root.specialization.getEffect(target))
data.attack += 0.1F;
}
}

1
CastingEffect.doEffectAttack(data, item, player, cantrigger, attackType);

锻造前缀效果

  • 无前缀/通用一般前缀 : 无效果
  • 通用垃圾前缀 : 造伤-10%,穿透-2,暴击率-5
  • 传奇前缀 : 造伤+30%,穿透+5,暴击率+10
  • 终极前缀 : 造伤+40%,穿透+8,暴击率+20
  • 尖刺 : 造伤+10%
  • 锋利 : 造伤+15%
  • 恶魔 : 造伤+20%
  • 暴力 : 暴击率+10
  • 狂暴 : 暴击率+15
  • 暴怒 : 暴击率+20
  • 若武器类型为物理近战:
  • 强力 : 造伤+10%
  • 强壮 : 造伤+15%
  • 强大 : 造伤+20%
  • 若武器类型为物理远程:
  • 精准 : 造伤+10%
  • 准确 : 造伤+10%
  • 迅猛 : 造伤+10%
  • 若武器类型为魔法:
  • 神奇 : 造伤+10%
  • 神秘 : 造伤+15%
  • 魔导 : 造伤+20%
  • 参考
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public static final void doEffectAttack(AttackEffect data, ItemStack item, EntityPlayer player, boolean cantrigger, WeaponType weapontype) {
if (!cantrigger)
return;
CastingEffectType type = getType(item);
if (type == null)
return;
if (type.isNormal)
return;
if (type.isBad) {
data.attack -= 0.1F;
data.penetration_base -= 2;
data.crit -= 5;
return;
}
if (type == CastingEffectType.legend) {
data.attack += 0.3F;
data.crit += 10;
data.penetration_base += 5;
return;
}
if (type == CastingEffectType.eventually) {
data.attack += 0.4F;
data.crit += 20;
data.penetration_base += 8;
return;
}
switch (type) {
case Spike:
data.attack += 0.1F;
return;
case Sharp:
data.attack += 0.15F;
return;
case demon:
data.attack += 0.2F;
return;
case violence:
data.crit += 10;
return;
case violent:
data.crit += 15;
return;
case fury:
data.crit += 20;
return;
}
if (weapontype == null)
return;
if (weapontype == WeaponType.PhysicalMelee)
switch (type) {
case Strong:
data.attack += 0.1F;
return;
case StrongBig:
data.attack += 0.15F;
return;
case powerful:
data.attack += 0.2F;
return;
}
if (weapontype == WeaponType.PhysicalRange)
switch (type) {
case Precision:
data.attack += 0.1F;
return;
case accurate:
data.attack += 0.15F;
return;
case Rapid:
data.attack += 0.2F;
return;
}
if (weapontype == WeaponType.Magic)
switch (type) {
case magical:
data.attack += 0.1F;
return;
case mysterious:
data.attack += 0.15F;
return;
case Magicguide:
data.attack += 0.2F;
return;
}
}

1
MagicJadeRed.getAttackEffect(data, player, event.entityLiving, event.source, rootPlayer, rootTarget, event.ammount, false, false);

红色宝玉和黄色宝玉效果

源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static final AttackEffect getAttackEffect(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource soure, ManaMetalModRoot root_player, ManaMetalModRoot root_target, float attack, boolean isCrit, boolean hasCrit) {
ItemStack weapon = player.func_71045_bC();
if (weapon.func_77942_o() &&
weapon.func_77978_p().func_150297_b("weapon_strengthen", 10)) {
NBTTagCompound tag = weapon.func_77978_p().func_74775_l("weapon_strengthen");
int gem = NBTHelp.getIntSafe("magic_jade1", tag, -1);
MagicJadeRed gems = null;
int LV = -1;
if (gem != -1) {
gems = values()[gem / 3];
LV = gem % 3;
}
if (gems != null && LV > -1)
if (isCrit) {
crit(gems, LV, data, player, target, soure, root_player, root_target, attack, hasCrit);
} else {
attack_effect(gems, LV, data, player, target, soure, root_player, root_target, attack);
}
int gem2 = NBTHelp.getIntSafe("magic_jade3", tag, -1);
if (gem2 > 0)
data.critDamage += gem2 * 0.01F;
}
return data;
}

1
DamageSystemEvent.doDamageAttack(data, player, event.source, rootPlayer, rootTarget);

创伤系统

  • 检查配置文件中是否打开UseDamageSystem项,无则返回
  • 检查TraumaSystemTime创伤保护时间,大于0则返回
  • 通过以上检测后,遍历并应用创伤效果
  • 创伤效果
    • 脱水 : 受到的伤害+10%
    • 营养不良 : 造伤-5%,穿透-1,防御力-30,回避率-10,暴击率-10,受到的伤害+5%
    • Magic1 : 受到的伤害+10%
    • Magic2 : 受到的伤害+30%
    • 刺伤 : 造伤-20%,穿透-4,受到的伤害+5%
    • 感冒 : 造伤-10%,穿透-2
    • 中暑 : 造伤-10%,穿透-2
    • 烧烫伤 : 造伤-20%,穿透-4
    • 冻伤 : 造伤-20%,穿透-4
    • 皮肉伤 : 造伤-5%,穿透-1,受到的伤害+5%
    • 扭伤 : 造伤-10%,穿透-2,受到的伤害+5%
    • 拉伤 : 造伤-15%,穿透-3,受到的伤害+5%
    • 擦伤 : 造伤-20%,穿透-4,受到的伤害+5%
    • 骨折 : 暴击率-30,回避率-30
    • 粉碎性骨折 : 暴击率-90,回避率-90
    • 骨头断裂 : 暴击率-150,回避率-150
    • 撕裂伤 : 魔法攻击力-10,物理攻击力-10,穿透-4,受到的伤害+5%
    • 内溃伤 : 魔法攻击力-20,物理攻击力-20,穿透-6,受到的伤害+5%
    • 脑震荡 : 魔法攻击力-30,物理攻击力-30,穿透-8,受到的伤害+5%
    • 深度撕裂伤 : 造伤-20%,穿透-6,防御力-40,回避率-40,暴击率-40,受到的伤害+10%
    • 颅内溃伤 : 造伤-25%,穿透-8,防御力-50,回避率-50,暴击率-50,受到的伤害+20%
    • 多重器官衰竭 : 造伤-50%,穿透-16,防御力-200,回避率-100,暴击率-100,受到的伤害+30%
  • 参考
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
public static void doDamageAttack(AttackEffect data, EntityPlayer player, DamageSource source, ManaMetalModRoot rootPlayer, @Nullable ManaMetalModRoot rootTarget) {
if (!M3Config.UseDamageSystem)
return;
if (rootPlayer.carrer.TraumaSystemTime > 0)
return;
for (int s = 0; s < rootPlayer.carrer.DamageTypes.length; s++) {
if (rootPlayer.carrer.DamageTypes[s] != null)
effect(rootPlayer.carrer.DamageTypes[s], data, player, source, rootPlayer, rootTarget);
}
}

// 创伤效果:

public static void effect(DamageType type, AttackEffect data, EntityPlayer player, DamageSource source, ManaMetalModRoot rootPlayer, @Nullable ManaMetalModRoot rootTarget) {
switch (type) {
case Dehydration:
data.damage_add += 0.1F;
break;
case Malnutrition:
data.attack -= 0.05F;
data.penetration_base--;
data.defense -= 30;
data.avoid -= 10;
data.crit -= 10;
data.damage_add += 0.05F;
break;
case Magic1:
data.damage_add += 0.1F;
break;
case Magic2:
data.damage_add += 0.3F;
break;
case Stabbing:
data.attack -= 0.2F;
data.penetration_base -= 4;
data.damage_add += 0.05F;
break;
case Cold:
data.attack -= 0.1F;
data.penetration_base -= 2;
break;
case Hot:
data.attack -= 0.1F;
data.penetration_base -= 2;
break;
case Burns:
data.attack -= 0.2F;
data.penetration_base -= 4;
break;
case Frostbite:
data.attack -= 0.2F;
data.penetration_base -= 4;
break;
case Skin:
data.attack -= 0.05F;
data.penetration_base--;
data.damage_add += 0.05F;
break;
case Sprain:
data.attack -= 0.1F;
data.penetration_base -= 2;
data.damage_add += 0.05F;
break;
case Strain:
data.attack -= 0.15F;
data.penetration_base -= 3;
data.damage_add += 0.05F;
break;
case Bruise:
data.attack -= 0.2F;
data.penetration_base -= 4;
data.damage_add += 0.05F;
break;
case Fracture:
data.avoid -= 30;
data.crit -= 30;
break;
case Bonecrush:
data.avoid -= 90;
data.crit -= 90;
break;
case Bonebreak:
data.avoid -= 150;
data.crit -= 150;
break;
case Laceration:
data.attack_base_magic -= 10;
data.attack_base_physical -= 10;
data.penetration_base -= 4;
data.damage_add += 0.05F;
break;
case Internalbleeding:
data.attack_base_magic -= 20;
data.attack_base_physical -= 20;
data.penetration_base -= 6;
data.damage_add += 0.05F;
break;
case Concussion:
data.attack_base_magic -= 30;
data.attack_base_physical -= 30;
data.penetration_base -= 8;
data.damage_add += 0.05F;
break;
case Deeplaceration:
data.attack -= 0.2F;
data.penetration_base -= 6;
data.defense -= 40;
data.avoid -= 40;
data.crit -= 40;
data.damage_add += 0.1F;
break;
case Intracranialhemorrhage:
data.attack -= 0.25F;
data.penetration_base -= 8;
data.defense -= 50;
data.avoid -= 50;
data.crit -= 50;
data.damage_add += 0.2F;
break;
case Multipleorganfailure:
data.attack -= 0.5F;
data.penetration_base -= 16;
data.defense -= 200;
data.avoid -= 100;
data.crit -= 100;
data.damage_add += 0.3F;
break;
}
}

1
FoodSystem.doEffect(data, player, rootPlayer);

饮食平衡系统

  • 营养值最高为30点
  • 蛋豆鱼肉类每1点提高全能攻击力1点
  • 谷类每1点提高防御力1点
  • 蔬菜类每6点提高穿透1点
  • 水果类每1点提高暴击率1点、回避率1点
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FoodSystem {
public static void doEffect(AttackEffect data, EntityPlayer player, ManaMetalModRoot root) {
if (M3Config.UseBalancedDietSystem) {
data.mixAttack += root.carrer.food_data[1];
data.defense += root.carrer.food_data[0];
data.penetration_base += root.carrer.food_data[2] / 6;
data.crit += root.carrer.food_data[3];
data.avoid += root.carrer.food_data[3];
}
}
}


if (root.carrer.food_data[s] > 30) root.carrer.food_data[s] = 30;

1
ArmorEffect.doArmorData(data, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount, true);

装备效果

  • 应用装备镀金效果,攻击时,叠加所有镀金层数,每一层增加3%造伤、1暴击率、1穿透
  • 若装备包含NBT标签(类型为10,即Compound复合标签)”weapon_strengthen”(即鉴定后),每1点品质增加1%的造伤
  • 若装备存在名为listID的标签(额外属性NBT),且类型是11,从listID数组中取出属性枚举,并从listEffect中取出对应属性的数值,提升人物属性。分两个标签存是为了扩展性
  • 又捉到一行废代码,"ArmorStrengthen"估计是防具强化,最近被移除的功能
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public static final void doArmorData(AttackEffect data, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot root, ManaMetalModRoot rootTarget, DamageSource source, float damage, boolean isAttack) {
ItemStack[] armor = player.field_71071_by.field_70460_b;
int golden = 0;
for (int s = 0; s < armor.length; s++) {
if (isAttack) {
golden += getGoldArmor(armor[s]);
// 空语句
if (armor[s] == null || !armor[s].func_77942_o() || (armor[s]).field_77990_d.func_150297_b("ArmorStrengthen", 3));
if (armor[s] != null && armor[s].func_77942_o() && (armor[s]).field_77990_d.func_150297_b("weapon_strengthen", 10))
data.attack += 0.01F * (armor[s]).field_77990_d.func_74775_l("weapon_strengthen").func_74762_e("quality");
}
if (armor[s] != null && armor[s].func_77942_o() && (armor[s]).field_77990_d.func_150297_b("listID", 11))
getItemEffect(armor[s], data);
}
if (isAttack &&
golden > 0) {
data.attack += 0.03F * golden;
data.crit += golden;
data.penetration_base += golden;
}
}


public static void getItemEffect(ItemStack item, AttackEffect data) {
if (item.func_77942_o()) {
int[] listID = NBTHelp.getIntArraySafe("listID", item.func_77978_p(), new int[0]);
NBTTagList listEffect = NBTHelp.getNBTTagListSafe("listEffect", item.func_77978_p(), 5, new NBTTagList());
for (int s = 0; s < listID.length; s++) {
IMagicEffect effect = new IMagicEffect(MagicItemType.values()[listID[s]], listEffect.func_150308_e(s));
switch (effect.getType()) {
case crit:
data.crit = (int)(data.crit + effect.getValue());
break;
case attackMultiplier:
data.attack += effect.getValue();
break;
case physicalAttack:
data.attack_base_physical = (int)(data.attack_base_physical + effect.getValue());
break;
case penetrate:
data.penetration_base = (int)(data.penetration_base + effect.getValue());
break;
case magicAttack:
data.attack_base_magic = (int)(data.attack_base_magic + effect.getValue());
break;
case magicDefense:
data.defense = (int)(data.defense + effect.getValue());
break;
case avoid:
data.avoid = (int)(data.avoid + effect.getValue());
break;
case defenseMultiplier:
data.damage_reduce += effect.getValue();
break;
}
}
}
}

1
QuenchingJadeCore.doEffectAttack(data, item, player, cantrigger);

淬炼宝玉效果

  • 应用淬炼宝玉效果
    • WeaponBase1 : 穿透+1,造伤+10%,暴击率+3
    • WeaponBase2 : 穿透+2,造伤+10%,暴击率+1
    • WeaponBase3 : 穿透+1,造伤+15%,暴击率+2
    • WeaponBase4 : 穿透+2,造伤+10%,暴击率+1
    • WeaponBase5 : 穿透+1,造伤+20%,暴击率+3
    • WeaponRare1 : 穿透+2,造伤+25%,暴击率+3
    • WeaponRare2 : 穿透+3,造伤+20%,暴击率+3
    • WeaponRare3 : 穿透+2,造伤+25%,暴击率+3
    • WeaponRare4 : 穿透+3,造伤+20%,暴击率+3
    • WeaponRare5 : 穿透+2,造伤+20%,暴击率+4
    • WeaponEpic : 穿透+3,造伤+30%,暴击率+5
  • 不同属性存在相同效果,所以经常会感觉洗了和没洗一样x
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public static final void doEffectAttack(AttackEffect data, ItemStack item, EntityPlayer player, boolean cantrigger) {
if (item != null && cantrigger) {
ItemESQuenchingJade.QuenchingJadeEffectType effect = ItemESQuenchingJade.getType(item);
if (effect != null)
switch (effect) {
case WeaponBase1:
data.penetration_base++;
data.attack += 0.1F;
data.crit = (int)(data.crit + 3.0F);
break;
case WeaponBase2:
data.penetration_base += 2;
data.attack += 0.1F;
data.crit = (int)(data.crit + 1.0F);
break;
case WeaponBase3:
data.penetration_base++;
data.attack += 0.15F;
data.crit = (int)(data.crit + 2.0F);
break;
case WeaponBase4:
data.penetration_base += 2;
data.attack += 0.1F;
data.crit = (int)(data.crit + 1.0F);
break;
case WeaponBase5:
data.penetration_base++;
data.attack += 0.2F;
data.crit = (int)(data.crit + 3.0F);
break;
case WeaponRare1:
data.penetration_base += 2;
data.attack += 0.25F;
data.crit = (int)(data.crit + 3.0F);
break;
case WeaponRare2:
data.penetration_base += 3;
data.attack += 0.2F;
data.crit = (int)(data.crit + 3.0F);
break;
case WeaponRare3:
data.penetration_base += 2;
data.attack += 0.25F;
data.crit = (int)(data.crit + 3.0F);
break;
case WeaponRare4:
data.penetration_base += 3;
data.attack += 0.2F;
data.crit = (int)(data.crit + 3.0F);
break;
case WeaponRare5:
data.penetration_base += 2;
data.attack += 0.2F;
data.crit = (int)(data.crit + 4.0F);
break;
case WeaponEpic:
data.penetration_base += 3;
data.attack += 0.3F;
data.crit = (int)(data.crit + 5.0F);
break;
}
}
}

1
PotionData.potionEffect(player, data, cantrigger, event.entityLiving, rootPlayer, rootTarget, attackType, true);

药水效果

  • 应用目标和自身的药水效果
  • 由于代码量过多,下表为AI生成,可作参考

目标药水效果表

药水 ID (代码变量名) 对该目标攻击加成 (Attack) 目标防御削弱 (Lower Stats) 其它属性修正 特殊逻辑 / 备注
potionShocked - 韧性 -0.025, 穿透防御 -5 - 电击效果削弱敌方防御
potionPaperShikigami - 穿透防御 -10 - 纸符咒效果
potionPoisonSwamp attack + 50% 韧性 -0.05 - 毒沼状态下受创大幅增加
potionKillDemon attack + 20% - - 斩妖效果
potionNightContract attack + (LV+1)*10% - - 暗夜契约,随等级提升
potionDivineLight attack + 30% - - 神圣之光
potionAbsoluteTenacity - - - 特殊:强制对玩家造成 500点 剧毒伤害
potionBreakdown attack + 10% - - 崩溃效果
potionMoonCut attack + 20% - - 月光斩标记
potionDamageShield attack + 50% - - 伤害护盾反制标记
potionBadArmor attack + 30%*(1+LV) - - 破甲状态:等级越高受创越重
potionBow1 attack + 10% 韧性 -0.05 - 远程标记 1
potionBowTarget attack + 150% - critDamage + 150% 致命标记:极大幅度提升远程伤害
potionC4 attack + 30% - crit + 16, penetrate + 8 连段/标记效果 C4
potionC5 attack + 50% 穿透防御 -10 - 强力削弱
potionC12 attack + 30% - penetrate + 10, critDamage + 0.3 高级组合加成
potionH2 attack + 20% 穿透防御 -10 - 削弱型标记
potionASP_r1 attack + LV*0.5% - - 随等级微量提升攻击
potionASP_f2 attack + LV*5% - -
potionTorrentSlash attack + 15% - - 激流斩标记

自身药水效果表

药水 ID (代码变量名) 攻击系加成 (Attack/Final) 防御系加成 (Def/Reduce) 其它属性 (穿透/职业/暴击等) 特殊逻辑/备注
Year8Food attack + 88% - - 八周年系列:极高加成
Year8Power attack + 30% - - 八周年系列
Year8Potion 基础物攻/魔攻 +88 - - 增加面板基础值
Year8Crystal final_attack + 8% - - 最终伤害增益
K3 attack + 150%, final_attack + 50% - - 爆发性极强
Dake final_attack + 20% - - 每级额外增加 10% 终伤
JunterTrack attack + 60%, final_attack + 6% - - 随等级大幅提升 (1.2倍/级)
PurePrayer attack + 60% defense + 60 final_attack + 5% 全能型高级增益
Phantom - damage_reduce + 75% - 顶级减伤生存药水
BadArmor - defense - 100*(1+LV) - 负面效果:大幅削弱防御
LostSoul - 无敌帧 -(1+LV)*5 - 负面效果:更易被连续攻击
StarBash 基础物攻/魔攻 +(1+LV)*20 - final_attack + (1+LV)*5% 同时加基础属性与终伤
GreatDivine attack + 30% avoid + 10 crit + 10, critDamage + 30% 包含最终伤害 5%
Paoxiao attack + 30% - - 基础攻击百分比
Alcohol attack + (LV+1)*30% - final_attack + (LV+1)*4% 酒精增益,随等级成长极高
AlcoholDrunk damage_add + (LV+1)*10% defense - (LV+1)*120 - 双刃剑:增伤但大幅降防
AbsoluteDefense - del_damage = true - 受击时免疫伤害并消耗等级
ASP_d3 - defense + 原防御 * 500% - 坦克核心:5倍防御强化
ASP_f11 - damage_reduce + 75% - 同幻影药水效果
Honey - - critDamage + 20%, penetrate + 3 根据“养蜂”等级额外加 attack
Curse attack - 30% - damage_add + 20% 负面效果:降攻且受创增加
Paralysis attack - 2.0 defense - 300 crit/avoid/penetrate 大幅降低 致命负面:全属性瘫痪
MoonEvent attack + 20% defense + 16 crit/avoid + 4, penetrate + 1 均衡型系统增益
Breakthrough - - max_attack + 3.0 突破伤害上限
PureSpring - - career_increase + 5% 职业资源获取速度
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
public static final AttackEffect potionEffect(EntityPlayer player, AttackEffect data, boolean cantrigger, @Nullable EntityLivingBase target, ManaMetalModRoot rootPlayer, @Nullable ManaMetalModRoot rootTarget, @Nullable WeaponType type, boolean isAttack) {
if (isAttack && target != null && rootTarget != null) {
List<PotionEffectM3> listtarget = PotionEffectM3.getPotions(rootTarget);
for (int i = 0; i < listtarget.size(); i++) {
PotionEffectM3 PE = listtarget.get(i);
targetEffect(PE, player, data, cantrigger, target, rootPlayer, rootTarget, type, isAttack);
}
}
List<PotionEffectM3> list = PotionEffectM3.getPotions(rootPlayer);
for (int s = 0; s < list.size(); s++) {
PotionEffectM3 PE = list.get(s);
effect(PE, player, data, cantrigger, target, rootPlayer, rootTarget, type, isAttack);
}
return data;
}


public static final AttackEffect targetEffect(PotionEffectM3 PE, EntityPlayer player, AttackEffect data, boolean cantrigger, EntityLivingBase target, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, WeaponType type, boolean isAttack) {
switch (PE.ID) {
case potionShocked:
data.lower_toughness += 0.025F;
data.lower_penetration_defense += 5;
break;
case potionPaperShikigami:
data.lower_penetration_defense += 10;
break;
case potionPoisonSwamp:
data.attack += 0.5F;
data.lower_toughness += 0.05F;
break;
case potionKillDemon:
data.attack += 0.2F;
break;
case potionMagicArrow:
data.attack += 0.1F;
break;
case potionPoisonCut:
data.attack += 0.1F;
break;
case potionNightContract:
data.attack += 0.1F * (PE.LV + 1);
break;
case potionPoisonBlade:
data.attack += 0.1F;
break;
case potionDivineLight:
data.attack += 0.3F;
break;
case potionAbsoluteTenacity:
player.func_70097_a(AttackType.HighlyToxic, 500.0F);
break;
case potionBreakdown:
data.attack += 0.1F;
break;
case potionMoonCut:
data.attack += 0.2F;
break;
case potionC3:
data.attack += 0.3F;
break;
case potionASP_r1:
data.attack += 0.005F * PE.LV;
break;
case potionASP_r3:
data.attack += 0.2F;
break;
case potionASP_f2:
data.attack += 0.05F * PE.LV;
break;
case potionDamageShield:
data.attack += 0.5F;
break;
case potionBadArmor:
data.attack += 0.3F;
if (PE.LV > 0)
data.attack += 0.3F * PE.LV;
break;
case potionSpirits:
data.attack += 0.2F;
break;
case potionBow1:
data.attack += 0.1F;
data.lower_toughness += 0.05F;
break;
case potionC1:
data.attack += 0.5F;
break;
case potionC2:
data.attack += 0.3F;
break;
case potionC4:
data.attack += 0.3F;
data.crit += 16;
data.penetration_base += 8;
break;
case potionC5:
data.attack += 0.5F;
data.lower_penetration_defense += 10;
break;
case potionC8:
data.attack += 0.3F;
break;
case potionC9:
data.penetration_base += 8;
break;
case potionC13:
data.attack += 0.4F;
break;
case potionC16:
data.attack += 0.2F;
break;
case potionC12:
data.attack += 0.3F;
data.penetration_base += 10;
data.critDamage += 0.3F;
break;
case potionBowTarget:
data.attack += 1.5F;
data.critDamage += 1.5F;
break;
case potionH1:
data.attack += 0.1F;
break;
case potionH2:
data.attack += 0.2F;
data.lower_penetration_defense += 10;
break;
case potionBT1:
data.attack += 0.3F;
break;
case potionBT5:
data.attack += 0.1F;
break;
case potionBT6:
data.attack += 0.2F;
break;
case potionGuide:
data.attack += 0.2F;
break;
case potionWindcut:
data.attack += 0.1F;
break;
case potionInstantCut:
data.attack += 0.15F;
break;
case potionTorrentSlash:
data.attack += 0.15F;
break;
}
return data;
}


public static final AttackEffect effect(PotionEffectM3 PE, EntityPlayer player, AttackEffect data, boolean cantrigger, EntityLivingBase target, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, WeaponType type, boolean isAttack) {
int tempLV;
switch (PE.ID) {
case potionLostSoul:
data.InvincibilityFrames -= (1 + PE.LV) * 5;
break;
case potionDefensiveStrategy:
data.defense += 1 * (1 + PE.LV);
break;
case potionPhantom:
data.damage_reduce += 0.75F;
break;
case potionPureSpring:
data.career_increase += 0.05F;
break;
case potionBreakArmor:
data.damage_add += 0.3F * (1 + PE.LV);
break;
case potionBadArmor:
data.defense -= 100 * (1 + PE.LV);
break;
case potionYear8Food:
data.attack = (float)(data.attack + 0.88D);
break;
case potionYear8Potion:
data.attack_base_magic += 88;
data.attack_base_physical += 88;
break;
case potionYear8Power:
data.attack = (float)(data.attack + 0.3D);
break;
case potionYear8Crystal:
data.final_attack += 0.08F;
break;
case potionMysteriousIcecream:
data.attack = (float)(data.attack + 0.01D * (1 + PE.LV));
break;
case potionArrowSkill:
data.final_attack = (float)(data.final_attack + 0.03D);
if (PE.LV > 0)
data.final_attack = (float)(data.final_attack + 0.03D * PE.LV);
break;
case potionDake:
data.final_attack = (float)(data.final_attack + 0.2D);
if (PE.LV > 0)
data.final_attack = (float)(data.final_attack + 0.1D * PE.LV);
break;
case potionStarBash:
data.attack_base_physical += (1 + PE.LV) * 20;
data.attack_base_magic += (1 + PE.LV) * 20;
data.final_attack += (1 + PE.LV) * 0.05F;
break;
case potionBeat:
data.attack--;
data.final_attack -= 0.1F;
break;
case potionCurseOfTheRose:
data.attack -= 3.0F;
break;
case potionGreatDivineIntervention:
data.avoid += 10;
data.crit += 10;
data.attack += 0.3F;
data.critDamage += 0.3F;
data.final_attack += 0.05F;
break;
case potionRoseDivine:
data.avoid += 10;
data.crit += 10;
data.attack += 0.3F;
data.critDamage += 0.3F;
data.final_attack += 0.05F;
break;
case potionWarHorn:
data.attack += 0.3F;
data.final_attack += 0.05F;
break;
case potionMysteriousClock:
switch (PE.LV) {
case 0:
data.attack += 0.1F;
break;
case 1:
data.critDamage += 0.1F;
break;
case 2:
data.crit += 5;
break;
case 3:
data.max_attack_base += 1000;
break;
case 4:
data.penetration_base += 2;
break;
case 5:
data.attack_base_physical += 10;
break;
case 6:
data.attack_base_magic += 10;
break;
case 7:
data.no_tack_damage += 100.0F;
break;
case 8:
data.hp_blood += 0.01F;
break;
case 9:
data.final_attack += 0.03F;
break;
}
break;
case potionHalloween:
data.attack = (float)(data.attack + 0.3D);
break;
case potionPurePrayer:
data.final_attack += 0.05F;
data.attack = (float)(data.attack + 0.6D);
data.defense += 60;
break;
case IncreaseEffectFinal:
data.final_attack += 0.1F;
break;
case IncreaseEffectPenetrate:
data.penetration_base += 12;
break;
case IncreaseEffectPower:
data.attack_base_physical += 100;
data.attack_base_magic += 100;
data.attack++;
break;
case IncreaseEffectDefense:
data.defense += 40;
data.damage_reduce += 0.3F;
break;
case potionK4:
data.attack = (float)(data.attack + 0.2D);
if (PE.LV > 0)
data.attack += 0.2F * PE.LV;
break;
case potionLightSpeedCutting:
data.career_increase += 0.1F;
break;
case potionScissors:
data.career_increase += 0.1F;
break;
case potionBarrierGuardian:
data.career_increase += (1 + PE.LV) * 0.01F;
data.penetration_base += 1 + PE.LV;
break;
case potionSoulFire:
data.attack = (float)(data.attack + 0.12D);
if (PE.LV > 0)
data.attack += 0.12F * PE.LV;
break;
case potionFanLightS:
data.attack = (float)(data.attack + 0.5D);
data.career_increase += 0.1F;
data.penetration_base += 5;
break;
case potionBarrow1:
data.attack++;
data.career_increase += 0.1F;
break;
case potionC6:
data.attack++;
data.damage_reduce += 0.3F;
break;
case potionC7:
data.attack += 0.5F;
data.career_increase += 0.1F;
break;
case potionDead:
data.attack += 0.5F;
data.career_increase += 0.1F;
data.penetration_base += 5;
break;
case potionHerbalEssence:
data.career_increase += 0.1F;
break;
case potionH3:
data.attack++;
if (PE.LV > 0)
data.attack += 0.4F;
break;
case potionJunterTrack:
data.final_attack += 0.06F;
data.attack += 0.6F;
if (PE.LV > 0) {
data.final_attack += 0.06F * PE.LV;
data.attack += 0.6F * PE.LV;
}
if (PE.LV >= 4)
data.attack += 0.3F;
break;
case potionFragmentTracking:
data.career_increase += 0.1F;
break;
case potionBT2:
data.career_increase += 0.1F;
break;
case potionBT3:
data.attack += 0.5F;
break;
case potionBT4:
data.final_attack += 0.1F;
data.attack += 2.0F;
if (rootPlayer != null && rootPlayer.carrer.career_resource[1] > 0) {
data.final_attack += 0.1F;
data.career_increase += 0.1F;
}
break;
case potionWolfThanks:
data.attack += 0.5F;
break;
case potionPoisonMark:
data.career_increase += 0.1F;
break;
case potionDarkAxeCut:
data.attack += 0.5F;
data.final_attack += 0.1F;
data.career_increase += 0.1F;
break;
case potionMagicSave:
data.attack += 0.2F;
data.final_attack += 0.02F;
if (PE.LV > 0) {
data.attack += 0.2F * PE.LV;
data.final_attack += 0.02F * PE.LV;
}
break;
case potionMagicFire:
data.attack += 0.5F;
break;
case potionFireElement:
data.career_increase += 0.1F;
break;
case potionBloodRage:
data.final_attack += 0.2F;
break;
case potionRevenge:
data.career_increase += 0.1F;
break;
case potionPhantomSword:
data.career_increase += 0.1F;
break;
case pointAbsoluteDefense:
if (!isAttack) {
data.del_damage = true;
PotionEffectM3.reducePotionLV(rootPlayer, PotionM3.pointAbsoluteDefense);
}
break;
case potionStealthAssassination:
data.damage_reduce += 0.33F;
break;
case potionShadowShield:
data.defense += 30;
break;
case potionASP_d7:
data.del_damage = true;
break;
case potionK1:
if (!isAttack) {
data.del_damage = true;
PotionEffectM3.addPotion((EntityLivingBase)player, PotionM3.potionK2, 3, 0);
}
break;
case potionSpawn1:
data.defense += 100;
data.rdamage += 10;
data.damage_reduce += 0.2F;
break;
case potionSpawn2:
data.defense += 20;
data.rdamage += 10;
data.damage_reduce += 0.1F;
break;
case potionMagicSword:
data.attack += 0.1F * (PE.LV + 1);
break;
case potionKLunaPower:
data.attack += 0.04F;
if (PE.LV > 0)
data.attack += 0.04F * PE.LV;
break;
case potionK2:
data.final_attack += 0.3F;
break;
case potionK3:
data.attack += 1.5F;
data.final_attack += 0.5F;
break;
case potionBowTimes:
tempLV = PE.LV + 1;
data.attack += 0.2F * tempLV;
data.final_attack += 0.02F * tempLV;
break;
case potionTea:
data.attack += 0.1F;
data.penetration_base += 2;
if (PE.LV > 0)
data.attack += 0.05F * PE.LV;
break;
case potionFocus:
data.attack += 0.1F;
data.penetration_base += 5;
if (PE.LV > 0)
data.attack += 0.05F * PE.LV;
break;
case potionTreatment:
if (!player.field_70170_p.field_72995_K &&
rootPlayer.carrer.bloodData > player.func_110138_aP() * 0.9F) {
int hpbloodheal = 50;
if (PE.LV > 0)
hpbloodheal += PE.LV * 50;
rootPlayer.carrer.addBloodData(hpbloodheal);
}
break;
case potionGreenMirror:
data.attack_base_physical += 40;
data.attack_base_magic += 40;
data.final_attack += 0.1F;
break;
case potionBlueMirror:
data.damage_reduce += 0.3F;
data.final_attack += 0.1F;
break;
case potionRedMirror:
data.attack += 0.3F;
data.final_attack += 0.1F;
break;
case potionASP_d1:
data.defense = (int)(data.defense + Math.max(0.0F, rootPlayer.defe.getDefe() * 0.4F));
break;
case potionASP_d2:
data.defense = (int)(data.defense + Math.max(0.0D, rootPlayer.defe.getDefe() * 0.05D * PE.LV));
data.damage_reduce += 0.02F * PE.LV;
if (PE.LV >= 5)
data.reduce_gravity += 0.1F;
break;
case potionASP_d3:
data.defense = (int)(data.defense + Math.max(0.0F, rootPlayer.defe.getDefe() * 5.0F));
break;
case potionASP_d4:
data.defense += 100;
data.reduce_gravity += 0.1F;
break;
case potionASP_d5:
data.damage_reduce += 0.3F;
break;
case potionASP_d6:
data.defense = (int)(data.defense + Math.max(0.0D, rootPlayer.defe.getDefe() * 0.03D * PE.LV));
data.damage_reduce += 0.02F * PE.LV;
if (PE.LV >= 5)
data.reduce_gravity += 0.08F;
break;
case potionASP_d9:
data.defense = (int)(data.defense + Math.max(0.0F, rootPlayer.defe.getDefe() * 0.15F));
data.reduce_gravity += 0.1F;
break;
case potionASP_r2:
data.attack += PE.LV * 0.07F;
data.critDamage += PE.LV * 0.05F;
break;
case potionASP_r7:
data.attack += PE.LV * 0.05F;
data.hp_blood += PE.LV * 0.01F;
break;
case potionASP_r9:
data.final_attack += 0.25F;
data.attack_base += 48;
break;
case potionASP_m1:
case potionASP_m2:
data.attack += PE.LV * 0.15F;
break;
case potionASP_m3:
data.final_attack += 0.3F;
break;
case potionASP_m5:
data.attack += PE.LV * 0.1F;
break;
case potionASP_m6:
if (!player.field_70170_p.field_72995_K)
rootPlayer.mana.addPower((int)(rootPlayer.mana.getMagicMax() * 0.02F));
break;
case potionASP_m7:
data.no_tack_damage += rootPlayer.mana.getMagicMax() * 0.64F;
break;
case potionASP_m8:
data.attack += PE.LV * 0.03F;
break;
case potionASP_m9:
data.final_attack += 0.2F;
break;
case potionASP_f1:
data.attack += PE.LV * 0.07F;
break;
case potionASP_f5:
data.attack += PE.LV * 0.04F;
if (PE.LV >= 10)
data.final_attack += 0.1F;
break;
case potionASP_f7:
data.attack += 0.3F;
break;
case potionASP_f8:
data.damage_reduce += 0.15F;
break;
case potionASP_f9:
data.damage_reduce = (float)(data.damage_reduce + 0.02D * PE.LV);
if (PE.LV >= 5)
data.no_tack_damage += player.func_110138_aP() * 0.05F;
break;
case potionASP_f11:
data.damage_reduce += 0.75F;
break;
case potionHoney:
data.critDamage += 0.2F;
data.penetration_base += 3;
if (rootPlayer.produce.getLV(Produce.Beekeeping) >= 2)
data.attack += 0.05F;
if (rootPlayer.produce.getLV(Produce.Beekeeping) >= 6)
data.attack += 0.05F;
if (rootPlayer.produce.getLV(Produce.Beekeeping) >= 9)
data.attack += 0.05F;
if (PE.LV > 0)
data.attack += 0.05F * PE.LV;
break;
case potionCurse:
data.attack -= 0.3F;
data.damage_add += 0.2F;
if (PE.LV > 0) {
data.attack -= 0.1F * PE.LV;
data.damage_add += 0.1F * PE.LV;
}
break;
case potionDessert:
data.avoid += 8;
data.crit += 8;
data.attack += 0.1F;
data.critDamage += 0.2F;
if (PE.LV > 0)
data.attack += 0.05F * PE.LV;
break;
case potionQuick:
data.avoid += 12;
if (PE.LV > 0)
data.avoid += 4 * PE.LV;
break;
case potionDamageShield:
if (target != null)
PotionEffectM3.addPotion(target, PotionM3.potionDamageShield, 30, 0);
break;
case potionIncrease:
if (type != null && type == WeaponType.PhysicalMelee) {
data.attack += 0.3F;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
}
break;
case potionArchery:
if (type != null && type == WeaponType.PhysicalRange) {
data.attack += 0.3F;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
}
break;
case potionMagicGuide:
if (type != null && type == WeaponType.Magic) {
data.attack += 0.3F;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
}
break;
case potiotSharp:
data.attack += 0.5F;
break;
case potionDagger:
data.attack += 0.5F;
break;
case potionBloodStasis:
data.hp_blood += 0.04F;
data.career_increase += 0.1F;
break;
case potionGrass:
data.attack = (float)(data.attack + 0.5D);
data.career_increase += 0.1F;
break;
case potionbrewingS:
data.attack = (float)(data.attack + 0.3D);
data.crit += 4;
data.penetration_base += 3;
data.defense += 8;
data.avoid += 4;
data.rdamage += 2;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
break;
case potionCuisine:
data.attack = (float)(data.attack + 0.3D);
data.crit += 4;
data.penetration_base += 3;
data.defense += 8;
data.avoid += 4;
data.rdamage += 2;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
break;
case potiotGodPower:
data.attack = (float)(data.attack + 0.15D);
data.crit += 4;
data.penetration_base += 3;
data.defense += 8;
data.avoid += 4;
data.rdamage += 2;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
break;
case potionBattleAxe:
data.attack = (float)(data.attack + 0.15D);
data.crit += 4;
data.penetration_base += 3;
data.defense += 8;
data.avoid += 4;
data.rdamage += 2;
break;
case potionHarp:
data.attack = (float)(data.attack + 0.15D);
data.crit += 4;
data.penetration_base += 3;
data.defense += 8;
data.avoid += 4;
data.rdamage += 2;
if (PE.LV > 0)
data.attack += 0.05F * PE.LV;
break;
case potionHorn:
data.attack += 0.3F;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
break;
case potionPhysicallyInv:
data.attack += 0.4F;
break;
case potionAccurate:
data.crit += 12;
if (PE.LV > 0)
data.crit += 4 * PE.LV;
break;
case potionMagic:
data.attack += 0.25F;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
break;
case potionStrike:
data.attack += 0.2F;
if (PE.LV > 0)
data.attack += 0.1F * PE.LV;
break;
case potionPressure:
data.attack -= 0.3F;
data.damage_add += 0.2F;
if (PE.LV > 0) {
data.attack -= 0.2F * PE.LV;
data.damage_add += 0.2F * PE.LV;
}
break;
case potionTrenches:
data.defense = (int)(data.defense + 60.0F);
break;
case potionOfwar:
data.attack = (float)(data.attack + 0.5D);
data.final_attack += 0.1F;
data.career_increase += 0.1F;
break;
case potionOpblessing:
data.attack = (float)(data.attack + 0.15D);
data.crit += 4;
data.penetration_base += 3;
data.defense += 8;
data.avoid += 4;
break;
case potionSpellExcitation:
data.crit += 10;
data.avoid += 10;
data.penetration_base += 5;
if (PE.LV > 0) {
data.crit += 3 * PE.LV;
data.avoid += 3 * PE.LV;
}
break;
case potionPaoxiao:
data.attack += 0.3F;
break;
case potionAlcohol:
data.attack += (PE.LV + 1) * 0.3F;
data.final_attack += (PE.LV + 1) * 0.04F;
break;
case potionAlcoholDrunk:
data.damage_add += (PE.LV + 1) * 0.1F;
data.defense -= (PE.LV + 1) * 120;
break;
case potionbrewing1:
data.attack -= 0.2F;
break;
case potionbrewing5:
data.penetration_base += 5;
if (PE.LV > 0)
data.penetration_base += PE.LV;
break;
case potionWhiteSnake:
data.attack += 0.3F;
data.defense += 30;
break;
case potionElves0:
data.attack = (float)(data.attack + 0.15D);
data.crit += 4;
data.penetration_base += 3;
data.defense += 8;
data.avoid += 4;
data.rdamage += 2;
break;
case potionDarkPower:
if (PE.LV == 0) {
data.attack = (float)(data.attack + 0.3D);
data.crit += 8;
data.penetration_base += 4;
data.defense += 16;
data.avoid += 8;
data.rdamage += 2;
data.final_attack += 0.3F;
}
if (PE.LV == 2) {
data.defense += 100;
data.damage_reduce += 0.2F;
}
break;
case potionFood2:
data.attack = (float)(data.attack + 0.3D);
data.crit += 4;
data.penetration_base += 4;
data.defense += 8;
data.avoid += 4;
data.rdamage += 2;
break;
case potionAnesthetic:
data.attack++;
break;
case potionSwordman1:
data.attack++;
break;
case potionSwordman2:
data.attack += 0.02F;
if (PE.LV > 0)
data.attack = (float)(data.attack + 0.02D * PE.LV);
break;
case potionBow2:
data.attack += 0.5F;
data.career_increase += 0.1F;
break;
case potionBook1:
data.attack += 0.5F;
data.hp_blood += 0.04F;
break;
case potionBook2:
data.attack += 0.5F;
data.career_increase += 0.1F;
break;
case potionDagger2:
data.attack += 0.2F;
data.hp_blood += 0.05F;
break;
case potionDagger3:
data.attack += 0.5F;
data.final_attack += 0.1F;
data.career_increase += 0.1F;
break;
case potionDagger4:
data.final_attack += 0.3F;
data.damage_add += 0.4F;
break;
case potionSummon1:
data.attack += 0.5F;
data.final_attack += 0.1F;
data.career_increase += 0.1F;
break;
case potionCruseman2:
data.attack += 0.2F;
data.penetration_base += 2;
break;
case potionL3:
data.attack += 0.5F;
data.damage_reduce += 0.5F;
data.defense = (int)(data.defense + 300.0F);
break;
case potionL4:
data.attack = (float)(data.attack + 0.5D);
data.crit += 4;
data.penetration_base += 3;
data.defense += 8;
data.avoid += 4;
data.max_attack++;
break;
case potionElves2:
data.attack += 0.3F;
break;
case potionItemLapudaArtifact1:
data.attack++;
break;
case potionPowerShield:
data.attack += 0.5F;
break;
case potionCruseman1:
if (!player.field_70170_p.field_72995_K)
rootPlayer.mana.addPower(100);
data.hp_blood += 0.05F;
break;
case potionAncientSpell:
data.attack--;
data.penetration_base -= 10;
if (PE.LV > 0) {
data.penetration_base -= 5 * PE.LV;
data.attack -= 0.5F * PE.LV;
}
break;
case potiotFood:
data.career_increase += 0.1F;
data.defense += 100;
break;
case potionbrewing3:
data.defense += 36;
if (PE.LV > 0)
data.defense += 8 * PE.LV;
break;
case potionLavaDead:
data.defense -= 300;
if (PE.LV > 0)
data.defense -= 100 * PE.LV;
break;
case potionResistance2:
data.defense += 12;
if (PE.LV > 0)
data.defense += 8 * PE.LV;
break;
case potionFireTwitch:
data.avoid -= 200;
if (PE.LV > 0)
data.avoid -= 100 * PE.LV;
break;
case potionL1:
data.career_increase += 0.1F;
break;
case potionBloodCruse:
if (player.func_110143_aJ() < player.func_110138_aP() * 0.5F) {
data.attack -= 0.5F;
data.crit -= 30;
data.avoid -= 30;
data.damage_add++;
}
break;
case potionParalysis:
data.attack = (float)(data.attack - 2.0D);
data.crit -= 300;
data.penetration_base -= 50;
data.defense -= 300;
data.avoid -= 300;
if (PE.LV > 0)
data.attack -= 1.0F * PE.LV;
break;
case potionDefenseCounterattack:
data.attack = (float)(data.attack + 1.0D);
break;
case potionBreakthrough:
data.max_attack += 3.0F;
break;
case potionMoonEvent:
data.attack = (float)(data.attack + 0.2D);
data.crit += 4;
data.avoid += 4;
data.penetration_base++;
data.defense += 16;
break;
}
return data;
}

1
event.ammount += ItemStrengthenHelp.getWeaponAttackRoll(item) * ItemStrengthenHelp.getWeaponStrPower(item.func_77973_b());

武器强化加成

  • 应用武器强化后总攻击力加成,将各种强化系统(强化数、品质、宝玉)提供的攻击力进行累加
    • 判断是否存在”weapon_strengthen”标签(已鉴定)
    • 初始化attack变量为0
    • 获取”attack”标签的值(武器基础攻击力)并累加到attack变量
    • 获取装备所需等级和质量,通过公式(quality > 10) ? ((quality / 4 + LV / 14) * quality) : ((1 + LV / 20) * quality)计算后累加到attack
      • 高品质阶段(quality > 10),加成计算公式为 : (Quality/4 + LV/14) × Quality,这是一个平方级的增长曲线
      • 基础品质阶段 (quality <= 10),加成计算公式为 : (1 + LV/20) × Quality,这是一个线性增长曲线
      • 当品质跨过10这个门槛时,加成计算从“线性”跃迁到“类平方”
      • Java中的整数除法(如 LV / 14)会向下取整。例如,如果等级是 13,13 / 14 的结果是 0。
      • 由于 LV / 14 的取整特性,你会发现攻击力不是每一级都提升,而是每升 14 级时,数值会有一个明显的跳跃感
    • 获取”extra_attack”标签的值(额外攻击力)并累加到attack变量
    • 获取蓝色宝玉,通过公式 if (id < 50) { attack += id + 1;} else { attack += id - 49; }累加到attack变量
    • 返回一个不为负数的attack变量
    • 最后将attack变量加上一个固定值 1 计入伤害
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public static int getWeaponAttackRoll(ItemStack item) {
if (item == null)
return 0;
int attack = 0;
if (item.func_77942_o() &&
item.func_77978_p().func_150297_b("weapon_strengthen", 10)) {
NBTTagCompound tag = item.func_77978_p().func_74775_l("weapon_strengthen");
attack += NBTHelp.getIntSafe("attack", tag, 0);
int LV = MMM.getEquipmentNeedLV(item);
int quality = NBTHelp.getIntSafe("quality", tag, 0);
attack += getWeaponAttackQuality(item, LV, quality);
if (tag.func_150297_b("extra_attack", 3))
attack += tag.func_74762_e("extra_attack");
int id = tag.func_74762_e("magic_jade2");
if (id > 0)
if (id < 50) {
attack += id + 1;
} else {
attack += id - 49;
}
}
if (attack < 0)
attack = 0;
return attack;
}


public static final int getEquipmentNeedLV(ItemStack item) {
if (item != null) {
if (item.func_77973_b() instanceof IWeapon)
return ((IWeapon)item.func_77973_b()).needLV(item);
if (item.func_77973_b() instanceof ILevelArmor)
return ((ILevelArmor)item.func_77973_b()).getNeedLV(item);
if (ManaMetalAPI.ItemAttackBalance.containsKey(item.func_77973_b()))
return ((BattleType)ManaMetalAPI.ItemAttackBalance.get(item.func_77973_b())).needLV;
}
return 1;
}


public static int getWeaponAttackQuality(ItemStack item, int LV, int quality) {
return (quality > 10) ? ((quality / 4 + LV / 14) * quality) : ((1 + LV / 20) * quality);
}


public static float getWeaponStrPower(Item item) {
return 1.0F;
}

1
ItemStrengthenHelp.getWeaponStarEvent(item, data, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount, cantrigger);

武器星级效果

  • 每一星级+10%造伤
  • 拥有三星NBT标签时根据其值获取相应属性,暴击率+8 或 基础攻击力+16 或 穿透+1
  • 拥有五星NBT标签时根据其值获取相应属性,暴击率+16 或 基础攻击力+24 或 穿透+3
  • 拥有十星NBT标签时根据其值获取相应属性,吸血+10% 或 对BOSS单位造伤+30% 或 穿透+8 或 终伤+7% 或 基础攻击力+64
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public static void getWeaponStarEvent(ItemStack item, AttackEffect data, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, DamageSource source, float damage, boolean cantrigger) {
if (item == null)
return;
if (item.func_77942_o() &&
item.func_77978_p().func_150297_b("weapon_strengthen", 10)) {
NBTTagCompound tag = item.func_77978_p().func_74775_l("weapon_strengthen");
if (tag.func_150297_b("star", 3)) {
float attackdata = 0.1F * tag.func_74762_e("star");
data.attack += attackdata;
} else {
return;
}
if (tag.func_150297_b("star_effect3", 3))
switch (tag.func_74762_e("star_effect3")) {
case 1:
data.crit += 8;
break;
case 2:
data.attack_base += 16;
break;
case 3:
data.penetration_base++;
break;
}
if (tag.func_150297_b("star_effect5", 3))
switch (tag.func_74762_e("star_effect5")) {
case 1:
data.crit += 16;
break;
case 2:
data.attack_base += 24;
break;
case 3:
data.penetration_base += 3;
break;
}
if (tag.func_150297_b("star_effect10", 3))
switch (tag.func_74762_e("star_effect10")) {
case 1:
data.hp_blood += 0.1F;
break;
case 2:
if (target instanceof net.minecraft.entity.boss.IBossDisplayData)
data.attack += 0.3F;
break;
case 3:
data.penetration_base += 8;
break;
case 4:
data.final_attack += 0.07F;
break;
case 5:
data.attack_base += 64;
break;
}
}
}

1
SpiritualPower.doEffectAttack(data, player, event.entityLiving, rootPlayer, rootTarget);

灵力系统

  • 应用每个灵力槽提供的全能攻击力
  • 再应用每个灵力槽提供的品质效果
槽位索引 详细效果描述
[0] 等级1:赋予目标缓慢效果;等级2:穿透+2;等级3/5/6:暴伤+10%/20%/30%;等级4:赋予目标破甲效果。
[1] 提供造伤百分比加成,随等级提升分别为:10%、15%、20%、25%、30%、35%。
[2] (无实际代码逻辑)
[3] 将暴击率和回避率相加,随等级分别除以 20、18、16、14、10、8 后 +1 加到基础攻击力上。
[4] 联动加成:统计所有槽位中等级与此槽位相同的数量(has),额外提供 (has * 10%~15%) 的攻击力,10%~15%对应等级1~6,每级提升1%。
[5] 复合属性:暴伤提升(10%~35%) 且 穿透提升(1~6点),每级提升相同。
[6] 收益属性:掉宝率提升(10~35) 且 经验获取量提升(10%~35%),每级提升相同。
[7] 终极属性:等级1:对Boss造伤+20%;等级2:造伤+20%,穿透+4;等级3:爆伤+30%;等级4:吸血+10%;等级5/6:提供终伤(20%/25%)与穿透(10/12)。
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
public static final void doEffectAttack(AttackEffect data, EntityPlayer player, @Nullable EntityLivingBase target, ManaMetalModRoot root, @Nullable ManaMetalModRoot rootTarget) {
for (int s = 0; s < root.carrer.SpiritualPowerData.length; s++)
data.mixAttack += root.carrer.SpiritualPowerData[s];
switch (root.carrer.SpiritualPower[0]) {
case 1:
if (target != null)
try {
target.func_70690_d(new PotionEffect(2, 100, 0));
} catch (Exception exception) {}
break;
case 2:
data.penetration_base += 2;
break;
case 3:
data.critDamage += 0.1F;
break;
case 4:
if (rootTarget != null)
PotionEffectM3.addPotion(rootTarget, PotionM3.potionBadArmor, 5, 0);
break;
case 5:
data.critDamage += 0.2F;
break;
case 6:
data.critDamage += 0.3F;
break;
}
switch (root.carrer.SpiritualPower[1]) {
case 1:
data.attack += 0.1F;
break;
case 2:
data.attack += 0.15F;
break;
case 3:
data.attack += 0.2F;
break;
case 4:
data.attack += 0.25F;
break;
case 5:
data.attack += 0.3F;
break;
case 6:
data.attack += 0.35F;
break;
}
root.carrer.SpiritualPower[2];
if (root.carrer.SpiritualPower[3] > 0) {
int temp = root.crit.getCrit() + root.avoid.getAvoid();
switch (root.carrer.SpiritualPower[3]) {
case 1:
data.attack_base += temp / 20 + 1;
break;
case 2:
data.attack_base += temp / 18 + 1;
break;
case 3:
data.attack_base += temp / 16 + 1;
break;
case 4:
data.attack_base += temp / 14 + 1;
break;
case 5:
data.attack_base += temp / 10 + 1;
break;
case 6:
data.attack_base += temp / 8 + 1;
break;
}
}
if (root.carrer.SpiritualPower[4] > 0) {
int has = 0;
float dmg = 0.0F;
for (int i = 0; i < root.carrer.SpiritualPower.length; i++) {
if (root.carrer.SpiritualPower[i] == root.carrer.SpiritualPower[4])
has++;
}
switch (root.carrer.SpiritualPower[4]) {
case 1:
dmg = 0.1F;
break;
case 2:
dmg = 0.11F;
break;
case 3:
dmg = 0.12F;
break;
case 4:
dmg = 0.13F;
break;
case 5:
dmg = 0.14F;
break;
case 6:
dmg = 0.15F;
break;
}
if (has > 0)
data.attack += has * dmg;
}
switch (root.carrer.SpiritualPower[5]) {
case 1:
data.critDamage += 0.1F;
data.penetration_base++;
break;
case 2:
data.critDamage += 0.15F;
data.penetration_base += 2;
break;
case 3:
data.critDamage += 0.2F;
data.penetration_base += 3;
break;
case 4:
data.critDamage += 0.25F;
data.penetration_base += 4;
break;
case 5:
data.critDamage += 0.3F;
data.penetration_base += 5;
break;
case 6:
data.critDamage += 0.35F;
data.penetration_base += 6;
break;
}
switch (root.carrer.SpiritualPower[6]) {
case 1:
data.drop_temp += 10;
data.xp += 0.1F;
break;
case 2:
data.drop_temp += 15;
data.xp += 0.15F;
break;
case 3:
data.drop_temp += 20;
data.xp += 0.2F;
break;
case 4:
data.drop_temp += 25;
data.xp += 0.25F;
break;
case 5:
data.drop_temp += 30;
data.xp += 0.3F;
break;
case 6:
data.drop_temp += 35;
data.xp += 0.35F;
break;
}
switch (root.carrer.SpiritualPower[7]) {
case 1:
if (target != null &&
target instanceof net.minecraft.entity.boss.IBossDisplayData)
data.attack += 0.2F;
break;
case 2:
data.attack += 0.2F;
data.penetration_base += 4;
break;
case 3:
data.critDamage += 0.3F;
break;
case 4:
data.hp_blood += 0.1F;
break;
case 5:
data.final_attack += 0.2F;
data.penetration_base += 10;
break;
case 6:
data.final_attack += 0.25F;
data.penetration_base += 12;
break;
}
}

1
isDarkPower = ItemStrengthenHelp.darkPower(item, player, rootPlayer, data);

暗噬药水效果

  • 记录和应用暗噬药水效果
    • 当武器的黑暗灌注点数<=100时,给予玩家600s0级的暗噬药水效果,并标记isDarkPower为true
    • 当武器的黑暗灌注点数>100时,给予玩家600s (点数/100) 级的暗噬药水效果,并标记isDarkPower为true
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static final boolean darkPower(ItemStack item, EntityPlayer player, ManaMetalModRoot rootPlayer, AttackEffect data) {
boolean isDarkPower = false;
if (!PotionEffectM3.isPotion(rootPlayer, PotionM3.potionDake)) {
if (item.field_77990_d != null && item.field_77990_d.func_150297_b("darkPower", 3)) {
int power = item.field_77990_d.func_74762_e("darkPower");
if (power > 0) {
item.field_77990_d.func_74768_a("darkPower", power - 1);
if (power <= 100) {
PotionEffectM3.addPotion(rootPlayer, PotionM3.potionDake, 600, 0);
isDarkPower = true;
} else {
int LV = power / 100;
PotionEffectM3.addPotion(rootPlayer, PotionM3.potionDake, 600, LV);
isDarkPower = true;
}
}
}
} else {
return true;
}
return isDarkPower;
}

1
2
AttackEffect.add(data, rootPlayer.carrer.effect_hotpot);
AttackEffect.add(data, rootPlayer.carrer.effect_poison);

火锅和药水效果


1
EventSpell.attack(item, data, player, event.entityLiving, rootPlayer, rootTarget, event.source, event.ammount);

刺客专精

  • 吸血+5%
  • 若玩家当前生命值 >= 最大生命值,且开启了左上专精,则攻击时获得30s最大生命值15%的临时生命值
  • 若开启了左下专精,攻击时增加当前血量百分比 × 0.3%的造伤,二转后系数变为0.6%
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static final void attack(ItemStack item, AttackEffect data, EntityPlayer player, EntityLivingBase target, ManaMetalModRoot root, ManaMetalModRoot rootTarget, DamageSource source, float damage) {
switch (CareerCore.getPlayerCarrer(root)) {
case dagger:
data.hp_blood += 0.05F;
if (player.func_110143_aJ() >= player.func_110138_aP() &&
root.specialization.getMainEffect(NbtSpecialization.MainSpecialization.upperLeft))
root.carrer.addTemporaryHP(TemporaryHP.Specialization_Swordman_1_1, (int)(player.func_110138_aP() * 0.15F), 30);
if (root.specialization.getMainEffect(NbtSpecialization.MainSpecialization.bottomLeft)) {
float bloodcount = root.carrer.bloodData / root.carrer.bloodDataMax * player.func_110138_aP() * 100.0F;
float power = bloodcount * 0.003F;
if (root.carrer.isTransfer2())
power = bloodcount * 0.006F;
if (power > 0.0F)
data.attack += power;
}
break;
case null:
if (root.specialization.getMainEffect(NbtSpecialization.MainSpecialization.upperLeft))
data.final_attack -= 0.25F;
break;
case null:
if (!rootTarget.ManaEntityData.potions.isEmpty())
data.attack += 0.2F * rootTarget.ManaEntityData.potions.size();
break;
}
}

1
ArcheologyCore.attack(data, player, event.entityLiving, event.source, rootPlayer, rootTarget);

古物系统

  • 应用五个槽位的古物
  • 从物品的 NBT 标签中获取该古物的类型、词缀 (Affix) 和 特殊修改属性 (Modify)
属性枚举 (Modify) 效果描述 触发条件/具体算法
magicDefense 增加附加伤害 增加量 = 闪避率 × 2
physicalAttack 增加附加伤害 增加量 = 当前法力值 × 0.04
magicAttack 终伤 +10% 1% 概率触发
crit 造伤 +20% 当前法力值 ≥ 最大法力值的 50%
avoid 造伤 +20% 目标生命值 ≤ 其最大生命值的 50%
hpReply 造伤随机提升 提升 1% ~ 30% 之间的随机数值
manaReply 造伤 +120% 3% 概率触发
dropRate 增加附加伤害 增加量 = 暴击率 × 2
HP 造伤 +40% 自身生命值 ≤ 最大生命值的 50%
manaMax 造伤波动 50%几率增加减少 1% ~ 50% 的造伤
attackMultiplier 吸血提升 2% 无条件触发
defenseMultiplier 造伤 +25% 5% 概率使自己获得 诅咒 效果
magicRelief 造伤 +40% 3% 概率使自己获得 中毒 效果
healthRecovery 造伤 +40% 无条件触发
penetrate 吸血 +1% 无条件触发
water 造伤 +40% 无条件触发
fatigue 造伤 +30% 无条件触发
health 造伤 +60% 1% 概率使自己受到 剧毒 伤害(自身血量 10%)
monster_attack 造伤 +25% 必定使自己获得8s的 缓慢 效果
词缀枚举 (Affix) 效果描述 触发条件/具体数值
magicDefense 增加基础魔法攻击力 固定增加 10 点
physicalAttack 增加基础物理攻击力 固定增加 10 点
magicAttack 增加吸血比例 固定增加 1%
crit 提升暴击属性 增加 5 点暴击率10% 爆伤
avoid 提升暴击率 固定增加 9 点暴击率
hpReply 攻击附带异常状态 1% 概率使目标随机获得3s的 石化、冻结、雷击 之一
manaReply 瞬间治疗 5% 概率直接回复 500 点生命值
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
public static AttackEffect attack_effect(ItemStack item, AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot root, ManaMetalModRoot root_target) {
ItemAntiquitiesBase ant = (ItemAntiquitiesBase)item.func_77973_b();
AntiquitiesType type = ant.getAntiquitiesType(item, player);
AntiquitiesAffix afx = ant.getAntiquitiesAffix(item.func_77978_p());
AntiquitiesModify mod = ant.getAntiquitiesModify(item.func_77978_p());
ant.attack_effect(item, data, player, target, source, root, root_target);
switch (mod) {
case magicDefense:
data.no_tack_damage += (root.avoid.getAvoid() * 2);
break;
case physicalAttack:
data.no_tack_damage += root.mana.getMana() * 0.04F;
break;
case magicAttack:
if (player.field_70170_p.field_73012_v.nextInt(100) == 0)
data.final_attack += 0.1F;
break;
case crit:
if (root.mana.getMana() >= root.mana.getMagicMax() * 0.5F)
data.attack += 0.2F;
break;
case avoid:
if (target != null &&
target.func_110143_aJ() <= target.func_110138_aP() * 0.5F)
data.attack += 0.2F;
break;
case hpReply:
data.attack += MathHelper.func_151240_a(player.field_70170_p.field_73012_v, 0.01F, 0.3F);
break;
case manaReply:
if (player.field_70170_p.field_73012_v.nextInt(100) < 3)
data.attack += 1.2F;
break;
case dropRate:
data.no_tack_damage += (root.crit.getCrit() * 2);
break;
case HP:
if (player.func_110143_aJ() <= player.func_110138_aP() * 0.5F)
data.attack += 0.4F;
break;
case manaMax:
data.attack += player.field_70170_p.field_73012_v.nextBoolean() ? MathHelper.func_151240_a(player.field_70170_p.field_73012_v, 0.01F, 0.5F) : -MathHelper.func_151240_a(player.field_70170_p.field_73012_v, 0.01F, 0.5F);
break;
case attackMultiplier:
data.hp_blood += 0.02F;
break;
case defenseMultiplier:
data.attack += 0.25F;
if (player.field_70170_p.field_73012_v.nextInt(100) < 5)
PotionEffectM3.addPotion((EntityLivingBase)player, PotionM3.potionCurse, 8, 0);
break;
case magicRelief:
data.attack += 0.4F;
if (player.field_70170_p.field_73012_v.nextInt(100) < 3)
PotionEffectM3.addPotion((EntityLivingBase)player, PotionM3.potionPoison, 20, 0);
break;
case healthRecovery:
data.attack += 0.4F;
break;
case penetrate:
data.hp_blood += 0.01F;
break;
case water:
data.attack += 0.4F;
break;
case fatigue:
data.attack += 0.3F;
break;
case health:
data.attack += 0.6F;
if (player.field_70170_p.field_73012_v.nextInt(100) < 1 && source != AttackType.HighlyToxic)
player.func_70097_a(AttackType.HighlyToxic, player.func_110143_aJ() * 0.1F);
break;
case monster_attack:
data.attack += 0.25F;
try {
player.func_70690_d(new PotionEffect(2, 160, 0));
} catch (Exception exception) {}
break;
}
switch (afx) {
case magicDefense:
data.attack_base_magic += 10;
break;
case physicalAttack:
data.attack_base_physical += 10;
break;
case magicAttack:
data.hp_blood += 0.01F;
break;
case crit:
data.crit += 5;
data.critDamage += 0.1F;
break;
case avoid:
data.crit += 9;
break;
case hpReply:
if (target != null && player.field_70170_p.field_73012_v.nextInt(100) == 0)
switch (player.field_70170_p.field_73012_v.nextInt(3)) {
case 0:
PotionEffectM3.addPotion(target, PotionM3.potionStone, 3, 0);
break;
case 1:
PotionEffectM3.addPotion(target, PotionM3.potionFreeze, 3, 0);
break;
case 2:
PotionEffectM3.addPotion(target, PotionM3.potionThunder, 3, 0);
break;
}
break;
case manaReply:
if (player.field_70170_p.field_73012_v.nextInt(100) < 5)
player.func_70691_i(500.0F);
break;
}
return data;
}

1
TileEntitySacrificialCeremony.effect(data, player, event.entityLiving, event.source, rootPlayer, rootTarget);

献灵仪式效果

仪式类型 (Type) 具体属性加成 (AttackEffect data)
Treasure 掉落率 +50
Soul 经验获取倍率 +30%
Evilmagic 穿透 +4, 造伤 +20%, 物攻 & 魔攻 +20, 防御 +40, 暴击率 +15, 闪避率 +15
Ancient 基础物理 & 魔法攻击力各 +20
Oldgod 终伤 +10%, 穿透 +10
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static final void effect(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot root_player, ManaMetalModRoot root_target) {
if (root_player.carrer.SacrificialCeremonyType != null)
switch (root_player.carrer.SacrificialCeremonyType) {
case Treasure:
data.drop_temp += 50;
break;
case Soul:
data.xp += 0.3F;
break;
case Evilmagic:
data.penetration_base += 4;
data.attack += 0.2F;
data.attack_base_magic += 20;
data.attack_base_physical += 20;
data.defense += 40;
data.crit += 15;
data.avoid += 15;
break;
case Ancient:
data.attack_base_magic += 20;
data.attack_base_physical += 20;
break;
case Oldgod:
data.final_attack += 0.1F;
data.penetration_base += 10;
break;
}
}

1
2
if (CareerCore.testPlayerWeapon(player, CareerCore.getPlayerCarrer(player)))
Attack += 0.5F;

职业武器加成

  • 若玩家当前手上的武器类型是否符合其职业,伤害倍率+50%
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public static boolean testPlayerWeapon(EntityPlayer player, CareerCore career) {
if (player.func_71045_bC() != null) {
Item weapon = player.func_71045_bC().func_77973_b();
if (weapon instanceof project.studio.manametalmod.instance_dungeon.IIncreaseWeapon)
return true;
switch (career) {
case null:
if (weapon instanceof project.studio.manametalmod.items.ItemToolDaggerBase)
return true;
break;
case Wis:
if (weapon instanceof project.studio.manametalmod.items.ItemToolBlowingArrows)
return true;
break;
case null:
if (weapon instanceof project.studio.manametalmod.items.ItemToolFan)
return true;
break;
case null:
if (weapon instanceof project.studio.manametalmod.items.ItemToolJavelin)
return true;
break;
case Agile:
if (weapon instanceof project.studio.manametalmod.items.ItemToolHammer)
return true;
break;
case Intelligence:
if (weapon instanceof project.studio.manametalmod.items.ItemToolMagicBook)
return true;
break;
case null:
if (weapon instanceof project.studio.manametalmod.items.ItemToolBowNew)
return weapon instanceof project.studio.manametalmod.items.ItemToolBowNew;
break;
case null:
if (weapon instanceof project.studio.manametalmod.items.ItemToolSickle)
return true;
break;
case Power:
if (weapon instanceof project.studio.manametalmod.items.ItemToolSwordBase)
return true;
break;
case Con:
if (weapon instanceof project.studio.manametalmod.items.ItemToolShortcane)
return true;
break;
case null:
if (weapon instanceof project.studio.manametalmod.items.ItemToolKatana)
return true;
if (MMM.isSlashBlade)
return SlashBladeCore.useSwordSlash(player.func_71045_bC());
break;
case null:
if (weapon instanceof project.studio.manametalmod.items.ItemToolWandMagic)
return true;
break;
}
}
return testPlayerWeaponModded(player, career);
}

1
2
if (rootPlayer.carrer.isTransfer2())
event.ammount += (5 * rootPlayer.carrer.getSpellLV_2()[4]);

二转技能战斗思想加成

  • 若达到二转,伤害 + (5 × 战斗思想技能等级)

1
2
3
4
if (item.field_77990_d != null && item.field_77990_d.func_150297_b("Gilded", 3)) {
goldPower = item.field_77990_d.func_74762_e("Gilded");
Attack += 0.1F * goldPower;
}

镀金系统

  • 应用武器镀金层数,每级伤害倍率+10%

1
2
3
4
if (item.func_77973_b() instanceof IFXItem && cantrigger) {
IFXItem fxitem = (IFXItem)item.func_77973_b();
fxitem.eventOnHit(data, player, event.entityLiving, event.source, rootPlayer, rootTarget, event.ammount, cantrigger);
}

特效武器

  • 检查武器是否为特效武器,是则触发特殊属性
  • 包含的物品有:
    • ItemToolSwordMisriruTrue(真米斯里鲁剑) : 给目标造成3s0级的冰缓药水效果,并恢复40点生命值
    • ItemToolBlowarrowDungeon(地下城吹箭) : 效果略,见下方代码
    • ItemToolBowDungeon(地下城弓) : 效果略,见下方代码
    • ItemToolDaggerDungeon(地下城匕首) : 效果略,见下方代码
    • ItemToolFanDungeon(地下城扇子) : 效果略,见下方代码
    • ItemToolHammerDungeon(地下城锤子) : 效果略,见下方代码
    • ItemToolMagicBookDungeon(地下城书) : 效果略,见下方代码
    • ItemToolSickleDungeon(地下城镰刀) : 效果略,见下方代码
    • ItemToolSwordDungeon(地下城剑) : 效果略,见下方代码
    • ItemToolWandMagicDungeon(地下城法杖) : 效果略,见下方代码
    • ItemToolSwordArtifacts : 穿透 + 5
    • ItemToolJavelinDungeon : 效果略,见下方代码
    • ItemToolKatanaDungeon : 效果略,见下方代码
    • ItemToolShocrtcaneDungeon : 效果略,见下方代码
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
// ItemToolBlowarrowDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
EntityArrowMagic arrow = null;
switch (this.id) {
case 0:
arrow = new EntityArrowMagic(player.field_70170_p, (EntityLivingBase)player, this.attack * 1.0F, ManaElements.Magic, (Entity)target, false);
if (!player.field_70170_p.field_72995_K)
player.field_70170_p.func_72838_d((Entity)arrow);
return;
case 1:
arrow = new EntityArrowMagic(player.field_70170_p, (EntityLivingBase)player, this.attack * 1.2F, ManaElements.Magic, (Entity)target, false);
if (!player.field_70170_p.field_72995_K)
player.field_70170_p.func_72838_d((Entity)arrow);
return;
case 2:
arrow = new EntityArrowMagic(player.field_70170_p, (EntityLivingBase)player, this.attack * 1.3F, ManaElements.Magic, (Entity)target, false);
if (!player.field_70170_p.field_72995_K)
player.field_70170_p.func_72838_d((Entity)arrow);
return;
case 3:
arrow = new EntityArrowMagic(player.field_70170_p, (EntityLivingBase)player, this.attack * 1.5F, ManaElements.Magic, (Entity)target, false);
if (!player.field_70170_p.field_72995_K)
player.field_70170_p.func_72838_d((Entity)arrow);
return;
}
}

// ItemToolBowDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
EntityArrowMagic arrow = null;
switch (this.id) {
case 0:
arrow = new EntityArrowMagic(player.field_70170_p, (EntityLivingBase)player, (float)this.attack * 1.0F, ManaElements.Magic, (Entity)target, false);
if (!player.field_70170_p.field_72995_K)
player.field_70170_p.func_72838_d((Entity)arrow);
PotionEffectM3.addPotion((EntityLivingBase)player, PotionM3.potionArchery, 10, 0);
return;
case 1:
arrow = new EntityArrowMagic(player.field_70170_p, (EntityLivingBase)player, (float)this.attack * 1.2F, ManaElements.Magic, (Entity)target, false);
if (!player.field_70170_p.field_72995_K)
player.field_70170_p.func_72838_d((Entity)arrow);
PotionEffectM3.addPotion((EntityLivingBase)player, PotionM3.potionArchery, 10, 1);
return;
case 2:
arrow = new EntityArrowMagic(player.field_70170_p, (EntityLivingBase)player, (float)this.attack * 1.3F, ManaElements.Magic, (Entity)target, false);
if (!player.field_70170_p.field_72995_K)
player.field_70170_p.func_72838_d((Entity)arrow);
PotionEffectM3.addPotion((EntityLivingBase)player, PotionM3.potionArchery, 10, 2);
return;
case 3:
arrow = new EntityArrowMagic(player.field_70170_p, (EntityLivingBase)player, (float)this.attack * 1.5F, ManaElements.Magic, (Entity)target, false);
if (!player.field_70170_p.field_72995_K)
player.field_70170_p.func_72838_d((Entity)arrow);
return;
}
}

// ItemToolDaggerDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
switch (this.id) {
case 0:
data.hp_blood += 0.02F;
return;
case 1:
data.hp_blood += 0.03F;
return;
case 2:
data.hp_blood += 0.04F;
return;
case 3:
data.hp_blood += 0.05F;
return;
}
}

// ItemToolFanDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
}

// ItemToolHammerDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
switch (this.id) {
case 0:
data.hp_blood += 0.02F;
return;
case 1:
data.hp_blood += 0.03F;
return;
case 2:
data.hp_blood += 0.04F;
return;
case 3:
data.hp_blood += 0.05F;
return;
}
}

// ItemToolMagicBookDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
switch (this.id) {
case 0:
target.func_70690_d(new PotionEffect(Potion.field_76421_d.func_76396_c(), 100, 1));
data.hp_blood += 0.05F;
return;
case 1:
target.func_70690_d(new PotionEffect(Potion.field_76421_d.func_76396_c(), 100, 1));
data.hp_blood += 0.06F;
return;
case 2:
target.func_70690_d(new PotionEffect(Potion.field_76421_d.func_76396_c(), 100, 1));
data.hp_blood += 0.07F;
return;
case 3:
target.func_70690_d(new PotionEffect(Potion.field_76421_d.func_76396_c(), 100, 1));
data.hp_blood += 0.08F;
return;
}
}

// ItemToolSickleDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
switch (this.id) {
case 0:
data.hp_blood += 0.02F;
return;
case 1:
data.hp_blood += 0.03F;
return;
case 2:
data.hp_blood += 0.04F;
return;
case 3:
data.hp_blood += 0.05F;
return;
}
}

// ItemToolSwordDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
switch (this.id) {
case 0:
target.func_70690_d(new PotionEffect(Potion.field_76421_d.func_76396_c(), 100, 1));
data.hp_blood += 0.02F;
return;
case 1:
target.func_70690_d(new PotionEffect(Potion.field_76421_d.func_76396_c(), 100, 1));
data.hp_blood += 0.03F;
return;
case 2:
target.func_70690_d(new PotionEffect(Potion.field_76421_d.func_76396_c(), 100, 1));
data.hp_blood += 0.04F;
return;
case 3:
target.func_70690_d(new PotionEffect(Potion.field_76421_d.func_76396_c(), 100, 1));
data.hp_blood += 0.05F;
return;
}
}

// ItemToolWandMagicDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
}

// ItemToolJavelinDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
}

// ItemToolKatanaDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
switch (this.id) {
case 0:
data.hp_blood += 0.02F;
return;
case 1:
data.hp_blood += 0.03F;
return;
case 2:
data.hp_blood += 0.04F;
return;
case 3:
data.hp_blood += 0.05F;
return;
}
}

// ItemToolShocrtcaneDungeon
public void eventOnHit(AttackEffect data, EntityPlayer player, EntityLivingBase target, DamageSource source, ManaMetalModRoot rootPlayer, ManaMetalModRoot rootTarget, float damage, boolean cantrigger) {
data.attack += 0.05F * (this.id + 1);
data.penetration_base += this.id + 1;
switch (this.id) {
case 0:
data.hp_blood += 0.02F;
return;
case 1:
data.hp_blood += 0.03F;
return;
case 2:
data.hp_blood += 0.04F;
return;
case 3:
data.hp_blood += 0.05F;
return;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if (attackType != null)
switch (attackType) {
case PhysicalMelee:
enchantmentLV = EnchantmentHelper.func_77506_a(Enchantment.field_77338_j.field_77352_x, item);
event.ammount += rootPlayer.carrer.getPhysicalAttack();
event.ammount += data.attack_base_physical;
data.attack += 0.01F * rootPlayer.carrer.getPowerPoint();
break;
case PhysicalRange:
enchantmentLV = EnchantmentHelper.func_77506_a(Enchantment.field_77345_t.field_77352_x, item);
event.ammount += rootPlayer.carrer.getPhysicalAttack();
event.ammount += rootPlayer.carrer.getArrowAttack();
event.ammount += data.attack_base_physical;
data.attack += 0.01F * rootPlayer.carrer.getAgilePoint();
break;
case Magic:
enchantmentLV = EnchantmentHelper.func_77506_a(ItemCraft10.ManaATK.field_77352_x, item);
event.ammount += rootPlayer.carrer.getMagicAttack();
event.ammount += data.attack_base_magic;
data.attack += 0.01F * rootPlayer.carrer.getIntelligencePoint();
break;
}
event.ammount += rootPlayer.carrer.mixAttack;
if (enchantmentLV > 0) {
event.ammount += (5 * enchantmentLV);
Attack += 0.1F * enchantmentLV;
}

攻击类型、武器附魔、职业属性、角色属性

  • 物理近战
    • 获取锋利附魔等级
    • 职业属性中的物理攻击力加入伤害中
    • 基础物理攻击力加入伤害中
    • 人物属性中的力量的1%加入造伤中
  • 物理远程
    • 获取力量附魔等级
    • 职业属性中的物理攻击力加入伤害中
    • 职业属性中的物理远程攻击力加入伤害中
    • 基础物理攻击力加到伤害中
    • 人物属性中的敏捷的1%加入造伤中
  • 法系
    • 获取魔法伤害附魔等级
    • 职业属性中的魔法攻击力加入伤害中
    • 基础魔法攻击力加入伤害中
    • 人物属性中的智慧的1%加入造伤中
  • 全能攻击力加入伤害中
  • 若上述附魔等级>0级,将 附魔等级 × 5 加入伤害中,同时伤害倍率提高 附魔等级 × 0.1

1
2
3
4
5
max_attack_damage += data.max_attack_base;
max_attack_damage += rootPlayer.carrer.getMAXdamage();
if (event.source instanceof EntityDamageSourceElement)
max_attack_damage += ((EntityDamageSourceElement)event.source).max_damage_effect;
max_attack_damage *= 1.0F + data.max_attack;

最大伤害计算

  • 最大伤害 = (基础最大伤害+职业属性基础最大伤害+特殊伤害来源效果) × (1 + 基础属性最大伤害)
    • 基础最大伤害 来源 : 神奇时钟药水效果potionMysteriousClock(PE.LV == 3)(+1000)
    • 职业属性基础最大伤害 来源 : 角色属性-力量(+40 / 1级)
    • 特殊伤害来源效果 来源 : 玩家无来源;Entity3DThrowable实体,若拥有药水效果potionLimitCharge,其最大伤害增加 3×二转最大伤害
    • 基础属性最大伤害 来源 : 药水效果potionL4(+1)、potionBreakthrough(+4)

1
2
3
4
5
6
7
8
9
critBase += data.crit;
Attack += data.attack;
Attack += rootPlayer.carrer.getAttackMultiplier();
hp_blood += data.hp_blood;
PenetrationBase += data.penetration_base;
event.ammount += data.attack_base;
data.final_attack += rootPlayer.carrer.finalDamage;
rootPlayer.carrer.extra_xpadd = data.xp;
data.career_increase += rootPlayer.carrer.career_increase;

其他属性计算