源码-魔法金属伤害计算

  1. 1. 总览
    1. 1.0.1. 位置
    2. 1.0.2. 源码
    3. 1.0.3. 前言
  • 2. 解读
    1. 2.0.1. 概念
    2. 2.0.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();
    }
    }

    前言

    • 叠个甲先
      • 本人已有四年独立游戏开发经验,正式从事游戏开发行业已有一年半时间。
      • 然而对MC的开发仅处于脚本层面,对源码更是知之甚少。
      • 源码中会有许多隐式的方法名,只能凭游戏理解猜测,如func_76346_g()。
      • 本着对魔金的热爱和对游戏开发的学习动机,才有了这么一篇文章。
      • 翻译如果有误请多包涵。

    解读

    概念

    • 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 : 回避率
    • final_attack : 最终伤害
    • max_attack_base : 最大伤害
    • attack_base_physical : 物理攻击力
    • attack_base_magic : 魔法攻击力
    • hp_blood : 吸血
    • attack_base : 基础攻击力 百科上译为:物理/魔法攻击力
    • mana.magicReliefTemp : 魔力减免
    • no_tack_damage : 附加伤害
    • 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

    逐步解释

    • 仅解释含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秒。
    依据
    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

    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;
    }
    }

    依据-毕业套效果
    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