public static bool Call(Component supposedlyEffectable, InteractionEffect interactionEffect) { if (supposedlyEffectable.TryGetComponent(out IPutable iPutable)) { if (interactionEffect == InteractionEffect.Wet) { iPutable.OnWet(); } else if (interactionEffect == InteractionEffect.Dry) { iPutable.OnDry(); } return(true); } return(false); }
public int CalcPower(int nMagic, IRole pAtker, IRole pTarget, ref InteractionEffect pSpecial , int nAdjustAtk = 0, bool bCanDodge = false) { int nPower = 0; if (nMagic == (int)MagicType.MAGICTYPE_NONE) { nPower += CalcAttackPower(pAtker, pTarget, ref pSpecial); } else { nPower = CalcMagicPower(pAtker, pTarget, nAdjustAtk, ref pSpecial); if (nMagic == (int)MagicType.MAGICTYPE_XPSKILL) { if (pTarget is Character) { nPower /= 50; } } } return(nPower); }
public void SendDamageMsg(uint pTarget, uint nDamage, InteractionEffect special) { }
public int Attack(IRole pTarget, ref InteractionEffect pEffects) { return(0); }
public int CalcMagicPower(IRole pAtker, IRole pTarget, int pAdjustAtk, ref InteractionEffect pSpecial) // /*=0*/, ref InteractionEffect special) { if (pTarget is Character) { Character pUser = pTarget as Character; if (pUser.QueryTransformation != null && pUser.QueryTransformation.Lookface == 223) { return(1); } } if (m_pOwner.Map.IsLineSkillMap()) { return(1); } if (pTarget.QueryStatus(FlagInt.VORTEX) != null) { return(1); } int nAtk = pAtker.MagicAttack; if (pAtker.Magics.QueryMagic() != null) { float tPower = pAtker.Magics.QueryMagic().QueryPower(); if (tPower > 30000) { tPower = (tPower - 30000) / 100f; nAtk = (int)(nAtk * tPower); } else { nAtk += (short)tPower; } } int nDef = pTarget.MagicDefense; // * (1 + (pTarget.Magic / 100)); if (pTarget is Character) { int nCounter = (int)(pTarget.Counteraction / 10f); int nPene = (int)(pAtker.Penetration / 100f); if (nCounter < nPene) { if (!Calculations.ChanceCalc((nPene - nCounter))) { Character pUser = pTarget as Character; nDef = (int)(nDef * (1 + (pUser.MagicDefenseBonus / 100f))); } else { nAtk = (int)(nAtk * 1.25f); pSpecial |= InteractionEffect.BREAKTHROUGH; } } else { Character pUser = pTarget as Character; nDef = (int)(nDef * (1 + (pUser.MagicDefenseBonus / 100f))); } } int nDamage = (int)((nAtk - nDef) * (1f - (pTarget.GetReduceDamage() / 100f))); nDamage = (int)(nDamage * (1f - (pTarget.GetTortoiseGemEffect() / 100f))); if (pAtker is Character && pTarget.IsMonster()) { nDamage = CalcDamageUser2Monster(nDamage, nDef, pAtker.Level, pTarget.Level); nDamage = pTarget.AdjustMagicDamage(nDamage); nDamage = AdjustMinDamageUser2Monster(nDamage, pAtker, pTarget); } else if (pAtker.IsMonster() && pTarget is Character) { nDamage = CalcDamageMonster2User(nDamage, nDef, pAtker.Level, pTarget.Level); nDamage = pTarget.AdjustMagicDamage(nDamage); nDamage = AdjustMinDamageMonster2User(nDamage, pAtker, pTarget); } else { nDamage = pAtker.AdjustMagicDamage(nDamage); } if (pAtker.BattlePower < pTarget.BattlePower) { if (pTarget is Character) { int levelDiff = pTarget.BattlePower - pAtker.BattlePower; float disccount = 0; if (levelDiff > 50) { disccount = 50; } else { disccount = 100 - levelDiff; } nDamage = (int)(nDamage * (disccount / 100)); } } if (pAtker.SkillCriticalStrike > pTarget.Immunity) { if (Calculations.ChanceCalc((float)(pAtker.SkillCriticalStrike - pTarget.Immunity) / 100)) { nDamage = (int)(nDamage * 2f); pSpecial |= InteractionEffect.CRITICAL_STRIKE; } } if (QueryMagic() != null && QueryMagic().GetElement() > ElementType.NONE) { switch (QueryMagic().GetElement()) { case ElementType.WATER: pSpecial |= InteractionEffect.WATER_RESIST; break; case ElementType.FIRE: pSpecial |= InteractionEffect.FIRE_RESIST; break; case ElementType.WOOD: pSpecial |= InteractionEffect.WOOD_RESIST; break; case ElementType.METAL: pSpecial |= InteractionEffect.METAL_RESIST; break; case ElementType.EARTH: pSpecial |= InteractionEffect.EARTH_RESIST; break; } } if (pAtker is Monster && QueryMagic() != null && QueryMagic().GetElement() > ElementType.NONE) { nDamage += pAtker.Magics.GetElementPower(pTarget); //switch (QueryMagic().GetElement()) //{ // case ElementType.WATER: // { // nDamage = (int)(nDamage * (1 - (pTarget.WaterResistance / 100f))); // break; // } // case ElementType.FIRE: // { // nDamage = (int)(nDamage * (1 - (pTarget.FireResistance / 100f))); // break; // } // case ElementType.EARTH: // { // nDamage = (int)(nDamage * (1 - (pTarget.EarthResistance / 100f))); // break; // } // case ElementType.WOOD: // { // nDamage = (int)(nDamage * (1 - (pTarget.WoodResistance / 100f))); // break; // } // case ElementType.METAL: // { // nDamage = (int)(nDamage * (1 - (pTarget.MetalResistance / 100f))); // break; // } //} } if (pAtker is Character) { nDamage += pAtker.AddFinalMagicAttack; } if (pTarget is Character) { nDamage -= pTarget.AddFinalMagicDefense; } // Adjust synflag damage if (pTarget is DynamicNpc) { //var npc = pTarget as DynamicNpc; //if (npc.IsSynFlag() // && npc.IsSynMoneyEmpty()) nDamage = nDamage * Character.SYNWAR_NOMONEY_DAMAGETIMES; } return(Calculations.CutTrail(1, nDamage)); }
public int CalcAttackPower(IRole attacker, IRole attacked, ref InteractionEffect pSpecial) { if (attacked is Character) { Character pUser = attacked as Character; if (pUser.QueryTransformation != null && pUser.QueryTransformation.Lookface == 223) { return(1); } } if (m_pOwner.Map.IsLineSkillMap()) { return(1); } if (attacked.QueryStatus(FlagInt.VORTEX) != null) { return(1); } int nAttack = 0; if (Calculations.ChanceCalc(50)) { nAttack = attacker.MaxAttack - ThreadSafeRandom.RandGet(1, Math.Max(1, attacker.MaxAttack - attacker.MinAttack) / 2 + 1); } else { nAttack = attacker.MinAttack + ThreadSafeRandom.RandGet(1, Math.Max(1, attacker.MaxAttack - attacker.MinAttack) / 2 + 1); } if (attacker is Character && attacked is Character && (attacker as Character).IsBowman()) { nAttack = (int)(nAttack / 1.5f); } // handle physical status if (attacker.QueryStatus(FlagInt.STIG) != null) { float tPower = attacker.QueryStatus(FlagInt.STIG).Power; if (tPower > 30000) { tPower = (tPower - 30000) / 100f; nAttack = (int)(nAttack * tPower); } else { nAttack += (short)tPower; } } int nRawDefense = attacked.Defense; int nDef = attacked.AdjustDefense(nRawDefense); if (attacker.QueryStatus(FlagInt.OBLIVION) != null && !(attacked is Character) && ((attacked is Monster) && !(attacked as Monster).IsBoss)) { nAttack *= 2; } if (attacker.QueryStatus(FlagInt.FATAL_STRIKE) != null && ((!attacked.IsDynaNpc() && !(attacked is Character)))) { float tPower = attacker.QueryStatus(FlagInt.FATAL_STRIKE).Power; if (tPower > 30000) { tPower = (tPower - 30000) / 100f; nAttack = (int)(nAttack * tPower); } else { nAttack += (short)tPower; } if (attacked is Monster) { Monster pMob = attacked as Monster; if (pMob.IsGuard()) { nAttack /= 10; } } } if (attacker.QueryStatus(FlagInt.VORTEX) != null && !attacked.IsDynaNpc() && !(attacked is Character)) { float tPower = attacker.QueryStatus(FlagInt.VORTEX).Power; if (tPower > 30000) { tPower = (tPower - 30000) / 100f; nAttack = (int)(nAttack * tPower); } else { nAttack += (short)tPower; } } if (attacker.QueryStatus(FlagInt.SUPERMAN) != null && (!attacked.IsDynaNpc() && !(attacked is Character))) { float tPower = attacker.QueryStatus(FlagInt.SUPERMAN).Power; if (tPower > 30000) { tPower = (tPower - 30000) / 100f; nAttack = (int)(nAttack * tPower); } else { nAttack += (short)tPower; } } if (attacked.QueryStatus(FlagInt.SHIELD) != null) { float tPower = attacked.QueryStatus(FlagInt.SHIELD).Power; if (tPower > 30000) { tPower = (tPower - 30000) / 100f; nDef = (int)(nDef * tPower); } else { nDef += (short)tPower; } } if (attacker.Magics.QueryMagic() != null) { float tPower = attacker.Magics.QueryMagic().QueryPower(); if (tPower > 30000) { tPower = (tPower - 30000) / 100f; nAttack = (int)(nAttack * tPower); } else { nAttack += (short)tPower; } } //float reduction = attacked.GetReduceDamage(); int nDamage = (int)((nAttack - nDef) * (1f - (attacked.GetReduceDamage() / 100f))); float tort = (attacked.GetTortoiseGemEffect() / 100f); nDamage = (int)(nDamage * (1f - tort)); if (nDamage <= 0) { nDamage = 7; } if (attacker is Character && attacked.IsMonster()) { nDamage = CalcDamageUser2Monster(nAttack, nDef, attacker.Level, attacked.Level); nDamage = attacked.AdjustWeaponDamage(nDamage); nDamage = AdjustMinDamageUser2Monster(nDamage, attacker, attacked); } else if (attacker.IsMonster() && attacked is Character) { nDamage = CalcDamageMonster2User(nAttack, nDef, attacker.Level, attacked.Level); nDamage = attacked.AdjustWeaponDamage(nDamage); nDamage = AdjustMinDamageMonster2User(nDamage, attacker, attacked); } else { nDamage = attacked.AdjustWeaponDamage(nDamage); } //if (attacker is Character && attacked is Character && attacker.BattlePower < attacked.BattlePower) //{ // nDamage /= 2; //} #region Block, Critical, Break if (attacker.BattlePower < attacked.BattlePower) { if (attacked is Character) { // Break (Pene is on the magic code) // Break through the battle power cap... // If the break fails, the damage is reduced by half. if (attacked.Counteraction < attacker.Breakthrough) { if (!Calculations.ChanceCalc((float)(attacker.Breakthrough - attacked.Counteraction) / 10)) { nDamage /= 2; } else { pSpecial |= InteractionEffect.BREAKTHROUGH; } //Owner.SendMessage(string.Format("Break: {0} Counter: {1} Difference: {2}%", GetBreakthrough(), pTarget.GetCounteraction(), (float)(GetBreakthrough() - pTarget.GetCounteraction()) / 10)); } else { nDamage /= 2; } } } // Critical is enabled on every monster. :) // Multiply the damage by 1.5 if (attacker.CriticalStrike > attacked.Immunity) { if (Calculations.ChanceCalc((float)(attacker.CriticalStrike - attacked.Immunity) / 100)) { nDamage = (int)(nDamage * 1.5f); pSpecial |= InteractionEffect.CRITICAL_STRIKE; } } if (attacked.Block > 0 && Calculations.ChanceCalc((float)attacked.Block / 100)) { nDamage /= 10; pSpecial |= InteractionEffect.BLOCK; } if (QueryMagic() != null && QueryMagic().GetElement() > ElementType.NONE) { switch (QueryMagic().GetElement()) { case ElementType.WATER: pSpecial |= InteractionEffect.WATER_RESIST; break; case ElementType.FIRE: pSpecial |= InteractionEffect.FIRE_RESIST; break; case ElementType.WOOD: pSpecial |= InteractionEffect.WOOD_RESIST; break; case ElementType.METAL: pSpecial |= InteractionEffect.METAL_RESIST; break; case ElementType.EARTH: pSpecial |= InteractionEffect.EARTH_RESIST; break; } } #endregion if (attacker is Monster && QueryMagic() != null && QueryMagic().GetElement() > ElementType.NONE) { switch (QueryMagic().GetElement()) { case ElementType.WATER: { nDamage = (int)(nDamage * (1 - (attacked.WaterResistance / 100f))); break; } case ElementType.FIRE: { nDamage = (int)(nDamage * (1 - (attacked.FireResistance / 100f))); break; } case ElementType.EARTH: { nDamage = (int)(nDamage * (1 - (attacked.EarthResistance / 100f))); break; } case ElementType.WOOD: { nDamage = (int)(nDamage * (1 - (attacked.WoodResistance / 100f))); break; } case ElementType.METAL: { nDamage = (int)(nDamage * (1 - (attacked.MetalResistance / 100f))); break; } } } if (attacker is Character) { nDamage += attacker.AddFinalAttack; } if (attacked is Character) { nDamage -= attacked.AddFinalDefense; } if (attacked is Monster) { nDamage = (int)Math.Min(nDamage, attacked.MaxLife * 700); } if (nDamage <= 0) { nDamage = 1; } return(nDamage); }
public bool ProcAttack_Hand2Hand() { try { if (m_pOwner == null || m_dwTargetId == 0 || !IsBattleMaintain()) { ResetBattle(); return(false); } } catch (Exception ex) { ServerKernel.Log.SaveLog("ProcAttack_Hand2Hand.IsBattleMaint", false, LogType.WARNING); ServerKernel.Log.SaveLog(ex.ToString(), false, LogType.EXCEPTION); return(false); } var pTarget = FindRole(m_dwTargetId); if (pTarget == null) { ResetBattle(); return(false); } if (m_pOwner.IsImmunity(pTarget)) { ResetBattle(); return(false); } Character pOwner = null; if (m_pOwner is Character) { pOwner = m_pOwner as Character; } if (IsTargetDodged(m_pOwner, pTarget)) { m_pOwner.SendDamageMsg(pTarget.Identity, 0, InteractionEffect.NONE); return(true); } // if archer //if (m_pOwner.IsBowman()) //{ // if (pOwner != null) // { // if (!pOwner.Equipment.Items.ContainsKey(5) || !pOwner.Equipment.Items[5].IsArrowSort() // || pOwner.Equipment.Items[5].Durability <= 0) // { // if (!pOwner.ReloadArrows()) // { // ResetBattle(); // return false; // no arrows // } // } // else // { // pOwner.Equipment.Items[5].Durability -= 1; // } // pOwner.Send(pOwner.Equipment.Items[5].InformationPacket(true)); // } //} if (QueryMagic() != null) { QueryMagic().AbortMagic(true); } if (pTarget is Character) { Character pTargetUser = pTarget as Character; if (pTargetUser.CheckScapegoat(m_pOwner)) { return(true); } } if (m_pOwner is Character && m_pOwner.AutoSkillAttack(pTarget)) { return(true); } InteractionEffect special = InteractionEffect.NONE; int nDamage = m_pOwner.Attack(pTarget, ref special); int nTargetLifeLost = Math.Max(1, nDamage); int nExp = (int)Math.Min(pTarget.MaxLife, nTargetLifeLost); if (m_pOwner.QueryStatus(FlagInt.FATAL_STRIKE) != null && pTarget is Monster) { Monster pMob = pTarget as Monster; if (!pMob.IsGuard() && !pMob.IsPlayer() && !pMob.IsDynaNpc() && !pMob.IsDynaMonster()) { m_pOwner.MapX = pTarget.MapX; m_pOwner.MapY = pTarget.MapY; var msg = new MsgAction(m_pOwner.Identity, pTarget.Identity, m_pOwner.MapX, m_pOwner.MapY, GeneralActionType.NINJA_STEP); m_pOwner.Send(msg); m_pOwner.Screen.SendMovement(msg); } } m_pOwner.SendDamageMsg(pTarget.Identity, (uint)nTargetLifeLost, special); if (nDamage == 0) { return(false); } // pTarget.AddAttribute(ClientUpdateType.HITPOINTS, -1*nTargetLifeLost, true); pTarget.BeAttack(0, m_pOwner, nDamage, true); // Syn rank DynamicNpc pNpc = null; Character pOwnerUser = null; if (pTarget is DynamicNpc) { pNpc = pTarget as DynamicNpc; } if (m_pOwner is Character) { pOwnerUser = m_pOwner as Character; } if (pNpc != null && pOwnerUser != null && pNpc.IsAwardScore()) { if (pNpc.IsCtfFlag()) { pOwnerUser.AwardCtfScore(pNpc, nTargetLifeLost); } else { pOwnerUser.AwardSynWarScore(pNpc, nTargetLifeLost); } } if (m_pOwner is Character && pNpc != null && pNpc.IsGoal() || pTarget.IsMonster()) // check is monster { nExp = m_pOwner.AdjustExperience(pTarget, nExp, false); int nAdditionExp = 0; if (!pTarget.IsAlive) { nAdditionExp = (int)(pTarget.MaxLife * 5 / 100); nExp += nAdditionExp; if (pOwnerUser != null) { if (pOwnerUser.Team != null) { pOwnerUser.Team.AwardMemberExp(pOwnerUser.Identity, pTarget, nAdditionExp); } } } m_pOwner.AwardBattleExp(nExp, true); if (!pTarget.IsAlive && nAdditionExp > 0) { if (!pTarget.IsAlive && !m_pOwner.Map.IsTrainingMap() && pOwnerUser != null) { pOwnerUser.Send(string.Format(ServerString.STR_KILLING_EXPERIENCE, nAdditionExp), ChatTone.TOP_LEFT); } } if (pOwnerUser != null) { Item item; if (pOwnerUser.Equipment.Items.TryGetValue(ItemPosition.RIGHT_HAND, out item)) { pOwnerUser.WeaponSkill.AwardExperience((ushort)item.GetItemSubtype(), nExp); } if (pOwnerUser.Equipment.Items.TryGetValue(ItemPosition.LEFT_HAND, out item)) { pOwnerUser.WeaponSkill.AwardExperience((ushort)item.GetItemSubtype(), nExp); } } } m_pOwner.AdditionMagic(nTargetLifeLost, nDamage); if (Calculations.ChanceCalc(5f) && m_pOwner is Character) { (m_pOwner as Character).SendWeaponMagic2(pTarget); } if (!pTarget.IsAlive) { int dwDieWay = m_pOwner.IsSimpleMagicAtk() ? 3 : 1; if (nDamage > pTarget.MaxLife / 3) { dwDieWay = 2; } m_pOwner.Kill(pTarget, m_pOwner.IsBowman() ? 5 : (uint)dwDieWay); } if (pOwnerUser != null && pOwnerUser.QueryStatus(FlagInt.FATAL_STRIKE) != null) { DestroyAutoAttack(); } return(true); }