protected override void OnTarget(Mobile from, object target) { from.RevealingAction(); if (!m_Instrument.IsChildOf(from.Backpack)) { from.SendLocalizedMessage(1062488); // The instrument you are trying to play is no longer in your backpack! } else if (target is BaseCreature) { BaseCreature bc_Target = target as BaseCreature; if (from.CanBeHarmful(bc_Target, true)) { if (bc_Target.NextBardingEffectAllowed > DateTime.UtcNow) { string timeRemaining = Utility.CreateTimeRemainingString(DateTime.UtcNow, bc_Target.NextBardingEffectAllowed, false, true, true, true, true); from.SendMessage("That target is not vulnerable to barding attempts for another " + timeRemaining + "."); return; } if (!BaseInstrument.CheckMusicianship(from)) { from.SendMessage("You struggle with basic musicianship and your song has no effect."); m_Instrument.PlayInstrumentBadly(from); m_Instrument.ConsumeUse(from); from.NextSkillTime = Core.TickCount + (int)(SkillCooldown.DiscordanceFailureCooldown * 1000); return; } double creatureDifficulty = bc_Target.InitialDifficulty; double effectiveBardSkill = from.Skills[SkillName.Discordance].Value + BaseInstrument.GetBardBonusSkill(from, bc_Target, m_Instrument); AspectArmorProfile aspectArmorProfile = AspectGear.GetAspectArmorProfile(from); if (aspectArmorProfile != null) { if (aspectArmorProfile.m_Aspect == AspectEnum.Lyric) { effectiveBardSkill += AspectGear.LyricEffectiveBardingSkillBonus * (AspectGear.LyricEffectiveBardingSkillBonusPerTier * (double)aspectArmorProfile.m_TierLevel); } } double successChance = BaseInstrument.GetBardSuccessChance(effectiveBardSkill, creatureDifficulty); TimeSpan effectDuration = BaseInstrument.GetBardDuration(bc_Target, creatureDifficulty); if (BaseInstrument.CheckSkillGain(successChance)) { from.CheckSkill(SkillName.Discordance, 0.0, 120.0, 1.0); } if (from.AccessLevel > AccessLevel.Player) { from.SendMessage("Chance of success was: " + Math.Round(successChance * 100, 3).ToString() + "%"); } if (Utility.RandomDouble() <= successChance) { from.DoHarmful(bc_Target, true); from.SendMessage("You play successfully, disrupting your opponent's skills and weakening them significantly."); m_Instrument.PlayInstrumentWell(from); m_Instrument.ConsumeUse(from); double discordanceModifier = BaseInstrument.DiscordanceModifier; DiscordanceInfo info = new DiscordanceInfo(from, bc_Target, discordanceModifier); info.m_Duration = effectDuration; info.m_EndTime = DateTime.UtcNow + effectDuration; info.m_Timer = Timer.DelayCall <DiscordanceInfo>(TimeSpan.Zero, TimeSpan.FromSeconds(1), new TimerStateCallback <DiscordanceInfo>(ProcessDiscordance), info); Discordance.InsertDiscordanceInfo(bc_Target, info); from.NextSkillTime = Core.TickCount + (int)(SkillCooldown.DiscordanceSuccessCooldown * 1000); bc_Target.NextBardingEffectAllowed = DateTime.UtcNow + bc_Target.BardingEffectCooldown; } else { m_Instrument.PlayInstrumentBadly(from); m_Instrument.ConsumeUse(from); from.NextSkillTime = Core.TickCount + (int)(SkillCooldown.DiscordanceFailureCooldown * 1000); string failureMessage = BaseInstrument.GetFailureMessage(successChance, SkillName.Discordance); from.SendMessage(failureMessage); if (aspectArmorProfile != null && from is PlayerMobile) { if (aspectArmorProfile.m_Aspect == AspectEnum.Lyric) { double failedBardingAttemptDamageReduction = AspectGear.LyricDamageReceivedReductionFromFailedBardingTarget * (AspectGear.LyricDamageReceivedReductionFromFailedBardingTargetPerTier * (double)aspectArmorProfile.m_TierLevel); failedBardingAttemptDamageReduction *= (from.Skills.Discordance.Value / 120); PlayerMobile player = from as PlayerMobile; player.m_LyricAspectFailedBardingAttemptExpiration = DateTime.UtcNow + AspectGear.LyricDamageReceivedReductionFromFailedBardingDuration; player.m_LyricAspectFailedBardingAttemptTargets.Clear(); player.m_LyricAspectFailedBardingAttemptTargets.Add(bc_Target); player.m_LyricAspectFailedBardingAttemptDamageReduction = failedBardingAttemptDamageReduction; } } } } else { return; } } else { from.SendLocalizedMessage(1049535); // A song of discord would have no effect on that. } }
protected override void OnTarget(Mobile from, object target) { from.RevealingAction(); if (!m_Instrument.IsChildOf(from.Backpack)) { from.SendLocalizedMessage(1062488); // The instrument you are trying to play is no longer in your backpack! } else if (target is BaseCreature) { BaseCreature bc_Target = target as BaseCreature; if (from.CanBeHarmful(bc_Target, true)) { if (bc_Target.NextBardingEffectAllowed > DateTime.UtcNow) { string timeRemaining = Utility.CreateTimeRemainingString(DateTime.UtcNow, bc_Target.NextBardingEffectAllowed, false, true, true, true, true); from.SendMessage("That target is not vulnerable to barding attempts for another " + timeRemaining + "."); return; } if (!BaseInstrument.CheckMusicianship(from)) { from.SendMessage("You struggle with basic musicianship and your song has no effect."); m_Instrument.PlayInstrumentBadly(from); m_Instrument.ConsumeUse(from); from.NextSkillTime = Core.TickCount + (int)(SkillCooldown.DiscordanceFailureCooldown * 1000); return; } double creatureDifficulty = bc_Target.InitialDifficulty; double effectiveBardSkill = from.Skills[SkillName.Discordance].Value + BaseInstrument.GetBardBonusSkill(from, bc_Target, m_Instrument); double successChance = BaseInstrument.GetBardSuccessChance(effectiveBardSkill, creatureDifficulty); TimeSpan effectDuration = BaseInstrument.GetBardDuration(bc_Target, creatureDifficulty); if (BaseInstrument.CheckSkillGain(successChance)) { from.CheckSkill(SkillName.Discordance, 0.0, 120.0, 1.0); } if (from.AccessLevel > AccessLevel.Player) { from.SendMessage("Chance of success was: " + Math.Round(successChance * 100, 3).ToString() + "%"); } if (Utility.RandomDouble() <= successChance) { from.DoHarmful(bc_Target, true); from.SendMessage("You play successfully, disrupting your opponent's skills and weakening them significantly."); m_Instrument.PlayInstrumentWell(from); m_Instrument.ConsumeUse(from); double discordanceModifier = BaseInstrument.DiscordanceModifier; DungeonArmor.PlayerDungeonArmorProfile bardDungeonArmor = new DungeonArmor.PlayerDungeonArmorProfile(from, null); if (bardDungeonArmor.MatchingSet && !bardDungeonArmor.InPlayerCombat) { discordanceModifier += bardDungeonArmor.DungeonArmorDetail.DiscordanceEffectBonus; } DiscordanceInfo info = new DiscordanceInfo(from, bc_Target, discordanceModifier); //TEST from.Say("Discord Duration: " + effectDuration.ToString()); info.m_Duration = effectDuration; info.m_EndTime = DateTime.UtcNow + effectDuration; info.m_Timer = Timer.DelayCall <DiscordanceInfo>(TimeSpan.Zero, TimeSpan.FromSeconds(1), new TimerStateCallback <DiscordanceInfo>(ProcessDiscordance), info); Discordance.InsertDiscordanceInfo(bc_Target, info); from.NextSkillTime = Core.TickCount + (int)(SkillCooldown.DiscordanceSuccessCooldown * 1000); bc_Target.NextBardingEffectAllowed = DateTime.UtcNow + bc_Target.BardingEffectCooldown; } else { m_Instrument.PlayInstrumentBadly(from); m_Instrument.ConsumeUse(from); from.NextSkillTime = Core.TickCount + (int)(SkillCooldown.DiscordanceFailureCooldown * 1000); string failureMessage = BaseInstrument.GetFailureMessage(successChance, SkillName.Discordance); from.SendMessage(failureMessage); } } else { return; } } else { from.SendLocalizedMessage(1049535); // A song of discord would have no effect on that. } }