diff --git a/.gitignore b/.gitignore
index b06e864a..3a2238d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,15 +15,17 @@
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
-x64/
-x86/
-build/
+[Xx]64/
+[Xx]86/
+[Bb]uild/
bld/
[Bb]in/
[Oo]bj/
# Visual Studio 2015 cache/options directory
.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
@@ -74,14 +76,17 @@ _Chutzpah*
ipch/
*.aps
*.ncb
+*.opendb
*.opensdf
*.sdf
*.cachefile
+*.VC.db
# Visual Studio profiler
*.psess
*.vsp
*.vspx
+*.sap
# TFS 2012 Local Workspace
$tf/
@@ -106,6 +111,7 @@ _TeamCity*
# NCrunch
_NCrunch_*
.*crunch*.local.xml
+nCrunchTemp_*
# MightyMoose
*.mm.*
@@ -133,11 +139,11 @@ publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
-## TODO: Comment the next line if you want to checkin your
-## web deploy settings but do note that will include unencrypted
-## passwords
-#*.pubxml
+# TODO: Un-comment the next line if you do not want to checkin
+# your web deploy settings because they may include unencrypted
+# passwords
+#*.pubxml
*.publishproj
# NuGet Packages
@@ -148,13 +154,24 @@ publish/
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
+# NuGet v3's project.json files produces more ignoreable files
+*.nuget.props
+*.nuget.targets
-# Windows Azure Build Output
+# Microsoft Azure Build Output
csx/
*.build.csdef
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Microsoft Azure ApplicationInsights config file
+ApplicationInsights.config
+
# Windows Store app package directory
AppPackages/
+BundleArtifacts/
# Visual Studio cache files
# files ending in .cache can be ignored
@@ -197,6 +214,9 @@ UpgradeLog*.htm
# Microsoft Fakes
FakesAssemblies/
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
@@ -206,7 +226,20 @@ FakesAssemblies/
# Visual Studio 6 workspace options file
*.opt
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
# LightSwitch generated files
GeneratedArtifacts/
-_Pvt_Extensions/
ModelManifest.xml
+
+# Paket dependency manager
+.paket/paket.exe
+
+# FAKE - F# Make
+.fake/
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..66b5d062
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "external/SharpDX.Menu"]
+ path = external/SharpDX.Menu
+ url = https://github.com/L33T/SharpDX.Menu
diff --git a/Alerter.cs b/Alerter.cs
deleted file mode 100644
index 37841cb0..00000000
--- a/Alerter.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
-
- using SharpDX;
-
- ///
- /// Shows text for an amount of time.
- ///
- public class Alerter : Render.Text
- {
- #region Fields
-
- private readonly float _duration;
-
- private readonly float _endTime;
-
- private readonly float _startTime;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The x.
- /// The y.
- /// The text.
- /// The size.
- /// The color.
- /// Name of the face.
- /// The duration.
- public Alerter(
- int x,
- int y,
- string text,
- int size,
- ColorBGRA color,
- string faceName = "Calibri",
- float duration = 1f)
- : base(x, y, text, size, color, faceName)
- {
- this._duration = duration;
- this._startTime = Utils.TickCount;
- this._endTime = this._startTime + this._duration;
-
- Game.OnUpdate += this.Game_OnGameUpdate;
- }
-
- #endregion
-
- #region Public Properties
-
- ///
- /// Gets the duration.
- ///
- ///
- /// The duration.
- ///
- public float Duration
- {
- get
- {
- return this._duration;
- }
- }
-
- ///
- /// Gets the end time.
- ///
- ///
- /// The end time.
- ///
- public float EndTime
- {
- get
- {
- return this._endTime;
- }
- }
-
- ///
- /// Gets the start time.
- ///
- ///
- /// The start time.
- ///
- public float StartTime
- {
- get
- {
- return this._startTime;
- }
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Removes this instance.
- ///
- public void Remove()
- {
- this.Visible = false;
- this.Dispose();
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Fired when the game updates.
- ///
- /// The instance containing the event data.
- private void Game_OnGameUpdate(EventArgs args)
- {
- if (!(Utils.TickCount > this.EndTime))
- {
- return;
- }
-
- this.Visible = false;
- this.Dispose();
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/AntiGapcloser.cs b/AntiGapcloser.cs
deleted file mode 100644
index af8d8262..00000000
--- a/AntiGapcloser.cs
+++ /dev/null
@@ -1,237 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
-
- using LeagueSharp.Data.DataTypes;
-
- using SharpDX;
-
- ///
- /// The delegate for the event.
- ///
- /// The gapcloser.
- public delegate void OnGapcloseH(ActiveGapcloser gapcloser);
-
- ///
- /// The type of gapcloser.
- ///
- public enum GapcloserType
- {
- ///
- /// The gapcloser used a skillshot ability.
- ///
- [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly",
- Justification = "Reviewed. Suppression is OK here.")]
- Skillshot,
-
- ///
- /// The gapcloser used a targeted ability.
- ///
- Targeted
- }
-
- ///
- /// Represents a gapcloser.
- ///
- public struct Gapcloser
- {
- #region Fields
-
- ///
- /// The champion name
- ///
- public string ChampionName;
-
- ///
- /// The skill type
- ///
- public GapcloserType SkillType;
-
- ///
- /// The slot
- ///
- public SpellSlot Slot;
-
- ///
- /// The spell name
- ///
- public string SpellName;
-
- #endregion
- }
-
- ///
- /// Represents an active gapcloser.
- ///
- public struct ActiveGapcloser
- {
- #region Fields
-
- ///
- /// The end
- ///
- public Vector3 End;
-
- ///
- /// The sender
- ///
- public Obj_AI_Hero Sender;
-
- ///
- /// The skill type
- ///
- public GapcloserType SkillType;
-
- ///
- /// The slot
- ///
- public SpellSlot Slot;
-
- ///
- /// The start
- ///
- public Vector3 Start;
-
- ///
- /// The tick count
- ///
- public int TickCount;
-
- #endregion
- }
-
- ///
- /// Provides events and information about gapclosers.
- ///
- public static class AntiGapcloser
- {
- #region Static Fields
-
- ///
- /// The active gapclosers
- ///
- public static List ActiveGapclosers = new List();
-
- ///
- /// The gapcloser spells
- ///
- public static List Spells;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes static members of the class.
- ///
- static AntiGapcloser()
- {
- Spells =
- LeagueSharp.Data.Data.Get()
- .SpellsList.Select(
- x =>
- new Gapcloser
- {
- ChampionName = x.Key,
- SkillType =
- x.Value.SkillType == LeagueSharp.Data.Enumerations.GapcloserType.Skillshot
- ? GapcloserType.Skillshot
- : GapcloserType.Targeted,
- Slot = x.Value.Slot, SpellName = x.Value.SpellName
- })
- .ToList();
-
- Initialize();
- }
-
- #endregion
-
- #region Public Events
-
- ///
- /// Occurs on an incoming enemy gapcloser.
- ///
- public static event OnGapcloseH OnEnemyGapcloser;
-
- #endregion
-
- #region Public Methods and Operators
-
- public static void Initialize()
- {
- Game.OnUpdate += Game_OnGameUpdate;
- Obj_AI_Base.OnProcessSpellCast += Obj_AI_Base_OnProcessSpellCast;
- }
-
- public static void Shutdown()
- {
- Game.OnUpdate -= Game_OnGameUpdate;
- Obj_AI_Base.OnProcessSpellCast -= Obj_AI_Base_OnProcessSpellCast;
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Fired when the game updates.
- ///
- /// The instance containing the event data.
- private static void Game_OnGameUpdate(EventArgs args)
- {
- ActiveGapclosers.RemoveAll(entry => Utils.TickCount > entry.TickCount + 900);
- if (OnEnemyGapcloser == null)
- {
- return;
- }
-
- foreach (var gapcloser in
- ActiveGapclosers.Where(gapcloser => gapcloser.Sender.IsValidTarget())
- .Where(
- gapcloser =>
- gapcloser.SkillType == GapcloserType.Targeted
- || (gapcloser.SkillType == GapcloserType.Skillshot
- && ObjectManager.Player.Distance(gapcloser.Sender, true) < 250000))) // 500 * 500
- {
- OnEnemyGapcloser(gapcloser);
- }
- }
-
- ///
- /// Fired when the game processes a spell cast.
- ///
- /// The sender.
- /// The instance containing the event data.
- private static void Obj_AI_Base_OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args)
- {
- if (!SpellIsGapcloser(args))
- {
- return;
- }
-
- ActiveGapclosers.Add(
- new ActiveGapcloser
- {
- Start = args.Start, End = args.End, Sender = (Obj_AI_Hero)sender, TickCount = Utils.TickCount,
- SkillType =
- (args.Target != null && args.Target.IsMe) ? GapcloserType.Targeted : GapcloserType.Skillshot,
- Slot = ((Obj_AI_Hero)sender).GetSpellSlot(args.SData.Name)
- });
- }
-
- ///
- /// Checks if a spell is a gapcloser.
- ///
- /// The instance containing the event data.
- ///
- private static bool SpellIsGapcloser(GameObjectProcessSpellCastEventArgs args)
- {
- return Spells.Any(spell => spell.SpellName == args.SData.Name.ToLower());
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/App.config b/App.config
new file mode 100644
index 00000000..eb3a5db3
--- /dev/null
+++ b/App.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BetterWebClient.cs b/BetterWebClient.cs
deleted file mode 100644
index 774a3e9f..00000000
--- a/BetterWebClient.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-//Taken from http://keestalkstech.com/2014/03/a-slightly-better-webclient-class/
-
-namespace LeagueSharp.Common
-{
- using System;
- using System.Net;
-
- public class BetterWebClient : WebClient
- {
- #region Fields
-
- private WebRequest _request;
-
- #endregion
-
- #region Constructors and Destructors
-
- public BetterWebClient(CookieContainer cookies, bool autoRedirect = true)
- {
- this.CookieContainer = cookies ?? new CookieContainer();
- this.AutoRedirect = autoRedirect;
- }
-
- #endregion
-
- #region Public Properties
-
- //Gets or sets whether to automatically follow a redirect
- public bool AutoRedirect { get; set; }
-
- //Gets or sets the cookie container, contains all the
- //cookies for all the requests
- public CookieContainer CookieContainer { get; set; }
-
- //Gets last cookie header
- public string Cookies
- {
- get
- {
- return this.GetHeaderValue("Set-Cookie");
- }
- }
-
- public string Kappa
- {
- get
- {
- return "version5";
- }
- }
-
- //Get last location header
- public string Location
- {
- get
- {
- return this.GetHeaderValue("Location");
- }
- }
-
- //Get last status code
- public HttpStatusCode StatusCode
- {
- get
- {
- var result = HttpStatusCode.BadRequest;
-
- if (this._request != null)
- {
- var response = this.GetWebResponse(this._request) as HttpWebResponse;
-
- if (response != null)
- {
- result = response.StatusCode;
- }
- }
-
- return result;
- }
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- public string GetHeaderValue(string headerName)
- {
- string result = null;
-
- if (this._request != null)
- {
- var response = this.GetWebResponse(this._request) as HttpWebResponse;
- if (response != null)
- {
- result = response.Headers[headerName];
- }
- }
-
- return result;
- }
-
- #endregion
-
- #region Methods
-
- protected override WebRequest GetWebRequest(Uri address)
- {
- this._request = base.GetWebRequest(address);
-
- var httpRequest = this._request as HttpWebRequest;
-
- if (httpRequest != null)
- {
- httpRequest.AllowAutoRedirect = this.AutoRedirect;
- httpRequest.CookieContainer = this.CookieContainer;
- httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
- }
-
- return this._request;
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/Config.cs b/Config.cs
deleted file mode 100644
index 973ce60c..00000000
--- a/Config.cs
+++ /dev/null
@@ -1,180 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Globalization;
- using System.IO;
- using System.Security.Permissions;
- using System.Threading;
-
- using LeagueSharp.Sandbox;
-
- ///
- /// Gets information about the L# system.
- ///
- public static class Config
- {
- #region Static Fields
-
- ///
- /// The app data directory
- ///
- private static string _appDataDirectory;
-
- ///
- /// The league sharp directory
- ///
- private static string _leagueSharpDirectory;
-
- ///
- /// The selected language
- ///
- private static string _selectedLanguage;
-
- ///
- /// The show menu hotkey
- ///
- private static byte _showMenuHotkey;
-
- ///
- /// The show menu toggle hotkey
- ///
- private static byte _showMenuToggleHotkey;
-
- #endregion
-
- #region Constructors and Destructors
-
- [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
- static Config()
- {
- CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
- CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
- Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
- Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
- }
-
- #endregion
-
- #region Public Properties
-
- ///
- /// Gets the application data directory.
- ///
- ///
- /// The application data directory.
- ///
- public static string AppDataDirectory
- {
- get
- {
- if (_appDataDirectory == null)
- {
- _appDataDirectory =
- Path.Combine(
- Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
- "LS" + Environment.UserName.GetHashCode().ToString("X"));
- }
-
- return _appDataDirectory;
- }
- }
-
- ///
- /// Gets the selected language.
- ///
- ///
- /// The selected language.
- ///
- public static string SelectedLanguage
- {
- get
- {
- if (_selectedLanguage == null)
- {
- try
- {
- _selectedLanguage = SandboxConfig.SelectedLanguage;
- if (_selectedLanguage == "Traditional-Chinese")
- {
- _selectedLanguage = "Chinese";
- }
-
- if (_selectedLanguage.StartsWith("zh"))
- {
- _selectedLanguage = "Chinese";
- }
- }
- catch (Exception)
- {
- _selectedLanguage = "";
- Console.WriteLine(@"Could not get the menu language");
- }
- }
-
- return _selectedLanguage;
- }
- }
-
- ///
- /// Gets the show menu press key.
- ///
- ///
- /// The show menu press key.
- ///
- public static byte ShowMenuPressKey
- {
- get
- {
- if (_showMenuHotkey == 0)
- {
- try
- {
- _showMenuHotkey = (byte)SandboxConfig.MenuKey;
- _showMenuHotkey = _showMenuHotkey == 0 ? (byte)16 : _showMenuHotkey;
- _showMenuHotkey = Utils.FixVirtualKey(_showMenuHotkey);
- Console.WriteLine(@"Menu press key set to {0}", _showMenuHotkey);
- }
- catch
- {
- _showMenuHotkey = 16;
- Console.WriteLine(@"Could not get the menu press key");
- }
- }
-
- return _showMenuHotkey;
- }
- }
-
- ///
- /// Gets the show menu toggle key.
- ///
- ///
- /// The show menu toggle key.
- ///
- public static byte ShowMenuToggleKey
- {
- get
- {
- if (_showMenuToggleHotkey == 0)
- {
- try
- {
- _showMenuToggleHotkey = (byte)SandboxConfig.MenuToggleKey;
- _showMenuToggleHotkey = _showMenuToggleHotkey == 0 ? (byte)120 : _showMenuToggleHotkey;
- _showMenuToggleHotkey = Utils.FixVirtualKey(_showMenuToggleHotkey);
- Console.WriteLine(@"Menu toggle key set to {0}", _showMenuToggleHotkey);
- }
- catch
- {
- _showMenuToggleHotkey = 120;
- Console.WriteLine(@"Could not get the menu toggle key");
- }
- }
-
- return _showMenuToggleHotkey;
- }
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/CustomEvents.cs b/CustomEvents.cs
deleted file mode 100644
index e5d8e6b5..00000000
--- a/CustomEvents.cs
+++ /dev/null
@@ -1,326 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Collections.Generic;
- using System.Linq;
-
- ///
- /// Provides custom events.
- ///
- public static class CustomEvents
- {
- ///
- /// Provides custom events regarding the game.
- ///
- public class Game
- {
- #region Static Fields
-
- ///
- /// The nexus list
- ///
- private static readonly List NexusList = new List();
-
- ///
- /// The notified subscribers
- ///
- private static readonly List NotifiedSubscribers = new List();
-
- ///
- /// The end game called
- ///
- private static bool _endGameCalled;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes static members of the class.
- ///
- static Game()
- {
- Utility.DelayAction.Add(0, Initialize);
- }
-
- #endregion
-
- #region Delegates
-
- ///
- /// The delegate for
- ///
- /// The instance containing the event data.
- public delegate void OnGameEnded(EventArgs args);
-
- ///
- /// The delegate for
- ///
- /// The instance containing the event data.
- public delegate void OnGameLoaded(EventArgs args);
-
- #endregion
-
- #region Public Events
-
- ///
- /// Occurs when the game ends. This is meant as a better replacement to .
- ///
- public static event OnGameEnded OnGameEnd;
-
- ///
- /// Occurs when the game loads. This will be fired if the game is already loaded.
- ///
- public static event OnGameLoaded OnGameLoad;
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Initializes this instance.
- ///
- public static void Initialize()
- {
- foreach (var hq in ObjectManager.Get().Where(hq => hq.IsValid))
- {
- NexusList.Add(hq);
- }
-
- if (LeagueSharp.Game.Mode == GameMode.Running)
- {
- //Otherwise the .ctor didn't return yet and no callback will occur
- Utility.DelayAction.Add(500, () => { Game_OnGameStart(new EventArgs()); });
- }
- else
- {
- LeagueSharp.Game.OnStart += Game_OnGameStart;
- }
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Fired when the game is started.
- ///
- /// The instance containing the event data.
- private static void Game_OnGameStart(EventArgs args)
- {
- LeagueSharp.Game.OnUpdate += Game_OnGameUpdate;
-
- if (OnGameLoad != null)
- {
- foreach (
- var subscriber in OnGameLoad.GetInvocationList().Where(s => !NotifiedSubscribers.Contains(s)))
- {
- NotifiedSubscribers.Add(subscriber);
- try
- {
- subscriber.DynamicInvoke(new EventArgs());
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex);
- }
- }
- }
- }
-
- ///
- /// Fired when the game updates.
- ///
- /// The instance containing the event data.
- private static void Game_OnGameUpdate(EventArgs args)
- {
- if (OnGameLoad != null)
- {
- foreach (
- var subscriber in OnGameLoad.GetInvocationList().Where(s => !NotifiedSubscribers.Contains(s)))
- {
- NotifiedSubscribers.Add(subscriber);
- try
- {
- subscriber.DynamicInvoke(new EventArgs());
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex);
- }
- }
- }
-
- if (NexusList.Count == 0 || _endGameCalled)
- {
- return;
- }
-
- foreach (var nexus in NexusList)
- {
- if (nexus != null && nexus.IsValid && nexus.Health <= 0)
- {
- if (OnGameEnd != null)
- {
- OnGameEnd(new EventArgs());
- _endGameCalled = true; // Don't spam the event.
- }
- }
- }
- }
-
- #endregion
- }
-
- ///
- /// Provides custom events regarding units.
- ///
- public class Unit
- {
- #region Constructors and Destructors
-
- ///
- /// Initializes static members of the class.
- ///
- static Unit()
- {
- LeagueSharp.Game.OnProcessPacket += PacketHandler;
-
- //Initializes ondash class:
- ObjectManager.Player.IsDashing();
- }
-
- #endregion
-
- #region Delegates
-
- ///
- /// The delegate for
- ///
- /// The sender.
- /// The arguments.
- public delegate void OnDashed(Obj_AI_Base sender, Dash.DashItem args);
-
- ///
- /// The delegate for
- ///
- /// The sender.
- /// The instance containing the event data.
- public delegate void OnLeveledUp(Obj_AI_Base sender, OnLevelUpEventArgs args);
-
- ///
- /// The delegate for
- ///
- /// The sender.
- /// The instance containing the event data.
- public delegate void OnLeveledUpSpell(Obj_AI_Base sender, OnLevelUpSpellEventArgs args);
-
- #endregion
-
- #region Public Events
-
- ///
- /// Occurs when a unit dashes.
- ///
- public static event OnDashed OnDash;
-
- ///
- /// Occurs when a unit levels up.
- ///
- public static event OnLeveledUp OnLevelUp;
-
- ///
- /// Occurs when the player levels up a spell.
- ///
- public static event OnLeveledUpSpell OnLevelUpSpell;
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Triggers the on dash.
- ///
- /// The sender.
- /// The arguments.
- public static void TriggerOnDash(Obj_AI_Base sender, Dash.DashItem args)
- {
- var dashHandler = OnDash;
- if (dashHandler != null)
- {
- dashHandler(sender, args);
- }
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Handles packets.
- ///
- /// The instance containing the event data.
- private static void PacketHandler(GamePacketEventArgs args)
- {
- }
-
- #endregion
-
- ///
- /// The event arguments for the event.
- ///
- public class OnLevelUpEventArgs : EventArgs
- {
- #region Fields
-
- ///
- /// The new level
- ///
- public int NewLevel;
-
- ///
- /// The remaining points
- ///
- public int RemainingPoints;
-
- #endregion
- }
-
- ///
- /// The event arguments for the event.
- ///
- public class OnLevelUpSpellEventArgs : EventArgs
- {
- #region Fields
-
- ///
- /// The remainingpoints
- ///
- public int Remainingpoints;
-
- ///
- /// The spell identifier
- ///
- public int SpellId;
-
- ///
- /// The spell level
- ///
- public int SpellLevel;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- internal OnLevelUpSpellEventArgs()
- {
- }
-
- #endregion
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Damage.cs b/Damage.cs
deleted file mode 100644
index 0e249b7b..00000000
--- a/Damage.cs
+++ /dev/null
@@ -1,7775 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Collections.Generic;
- using System.Linq;
-
- using LeagueSharp.Common.Data;
-
- ///
- /// Gets the damage done to a target.
- ///
- /// The source.
- /// The target.
- /// The level.
- ///
- public delegate double SpellDamageDelegate(Obj_AI_Base source, Obj_AI_Base target, int level);
-
- ///
- /// Represents a spell that deals damage.
- ///
- public class DamageSpell
- {
- #region Fields
-
- ///
- /// The calculated damage
- ///
- public double CalculatedDamage;
-
- ///
- /// The damage delegate
- ///
- public SpellDamageDelegate Damage;
-
- ///
- /// The damage type
- ///
- public Damage.DamageType DamageType;
-
- ///
- /// The slot
- ///
- public SpellSlot Slot;
-
- ///
- /// The stage
- ///
- public int Stage;
-
- #endregion
- }
-
- ///
- /// Calculates damage to units.
- ///
- public static class Damage
- {
- #region Static Fields
-
- ///
- /// The spells
- ///
- public static Dictionary> Spells =
- new Dictionary>(StringComparer.OrdinalIgnoreCase);
-
- ///
- /// The attack passives
- ///
- private static readonly List AttackPassives = new List();
-
- #endregion
-
- #region Constructors and Destructors
-
- //attack passives are handled in the orbwalker, it will be changed in the future :^)
-
- ///
- /// Initializes static members of the class.
- ///
- static Damage()
- {
- //Add the passive damages
- PassiveDamage p;
-
- #region PassiveDamages
-
- #region Aatrox
-
- p = new PassiveDamage
- {
- ChampionName = "Aatrox",
- IsActive =
- (source, target) => (source.HasBuff("AatroxWPower") && source.HasBuff("AatroxWONHPowerBuff")),
- GetDamage = (source, target) => ((float)source.GetSpellDamage(target, SpellSlot.W)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Akali
-
- p = new PassiveDamage
- {
- ChampionName = "Akali", IsActive = (source, target) => true,
- GetDamage =
- (source, target) =>
- (float)
- source.CalcDamage(
- target,
- DamageType.Magical,
- (0.06 + Math.Abs(source.TotalMagicalDamage / 100) * 0.16667) * source.TotalAttackDamage)
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Akali", IsActive = (source, target) => target.HasBuff("AkaliMota"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q, 1)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Alistar
-
- p = new PassiveDamage
- {
- ChampionName = "Alistar", IsActive = (source, target) => (source.HasBuff("alistartrample")),
- GetDamage =
- (source, target) =>
- (float)
- source.CalcDamage(
- target,
- DamageType.Magical,
- 6d + source.Level + 0.1d * source.TotalMagicalDamage),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Ashe
-
- p = new PassiveDamage
- {
- ChampionName = "Ashe", IsActive = (source, target) => target.HasBuff("ashepassiveslow"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- source.TotalAttackDamage * (0.1 + (source.Crit * (1 + source.CritDamageMultiplier))))
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Ashe", IsActive = (source, target) => source.HasBuff("asheqattack"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Bard
-
- p = new PassiveDamage
- {
- ChampionName = "Bard",
- IsActive = (source, target) => source.GetBuffCount("bardpspiritammocount") > 0,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- new[] { 30, 55, 80, 110, 140, 175, 210, 245, 280, 315, 345, 375, 400, 425, 445, 465 }[
- Math.Min(source.GetBuffCount("bardpdisplaychimecount") / 10, 15)]
- + (source.GetBuffCount("bardpdisplaychimecount") > 150
- ? Math.Truncate((source.GetBuffCount("bardpdisplaychimecount") - 150) / 5d) * 20
- : 0) + 0.3 * source.TotalMagicalDamage)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Blatzcrink
-
- p = new PassiveDamage
- {
- ChampionName = "Blitzcrank", IsActive = (source, target) => source.HasBuff("PowerFist"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Braum
-
- p = new PassiveDamage
- {
- ChampionName = "Braum", IsActive = (source, target) => source.HasBuff("braummarkstunreduction"),
- GetDamage =
- (source, target) => source.CalcDamage(target, DamageType.Magical, 6.4 + (1.6 * source.Level))
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = string.Empty, IsActive = (source, target) => target.GetBuffCount("braummark") == 3,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- 32 + (8 * ((Obj_AI_Hero)target.GetBuff("braummark").Caster).Level))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Caitlyn
-
- p = new PassiveDamage
- {
- ChampionName = "Caitlyn", IsActive = (source, target) => (source.HasBuff("caitlynheadshot")),
- GetDamage =
- (source, target) =>
- ((float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- 1.5d * (source.BaseAttackDamage + source.FlatPhysicalDamageMod))),
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region ChoGath
-
- p = new PassiveDamage
- {
- ChampionName = "ChoGath", IsActive = (source, target) => source.HasBuff("VorpalSpikes"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Darius
-
- p = new PassiveDamage
- {
- ChampionName = "Darius", IsActive = (source, target) => true,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- ((9 + source.Level + (source.FlatPhysicalDamageMod * 0.3))
- * Math.Min(target.GetBuffCount("dariushemo") + 1, 5))
- * (target.Type == GameObjectType.obj_AI_Minion ? 0.25 : 1))
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Darius", IsActive = (source, target) => source.HasBuff("DariusNoxianTacticsONH"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Dianna
-
- p = new PassiveDamage
- {
- ChampionName = "Diana", IsActive = (source, target) => source.HasBuff("dianaarcready"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- 15
- + ((source.Level < 6
- ? 5
- : (source.Level < 11
- ? 10
- : (source.Level < 14 ? 15 : (source.Level < 16 ? 20 : 25)))) * source.Level)
- + (source.TotalMagicalDamage * 0.8))
- };
-
- #endregion
-
- #region DrMundo
-
- p = new PassiveDamage
- {
- ChampionName = "DrMundo", IsActive = (source, target) => source.HasBuff("Masochism"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Draven
-
- p = new PassiveDamage
- {
- ChampionName = "Draven", IsActive = (source, target) => (source.HasBuff("DravenSpinning")),
- GetDamage =
- (source, target) =>
- ((float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- 0.45d * (source.BaseAttackDamage + source.FlatPhysicalDamageMod))),
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Ekko
-
- p = new PassiveDamage
- {
- ChampionName = "Ekko", IsActive = (source, target) => (target.GetBuffCount("EkkoStacks") == 2),
- GetDamage =
- (source, target) =>
- (float)
- source.CalcDamage(
- target,
- DamageType.Magical,
- 10 + (source.Level * 10) + (source.TotalMagicalDamage * 0.8)),
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Ekko", IsActive = (source, target) => (target.HealthPercent < 30),
- GetDamage = (source, target) =>
- {
- var dmg =
- (float)
- source.CalcDamage(
- target,
- DamageType.Magical,
- (target.MaxHealth - target.Health)
- * (5 + Math.Floor(source.TotalMagicalDamage / 100) * 2.2f) / 100);
- if (!(target is Obj_AI_Hero) && dmg > 150f) dmg = 150f;
- return dmg;
- }
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Fizz
-
- p = new PassiveDamage
- {
- ChampionName = "Fizz", IsActive = (source, target) => source.GetSpell(SpellSlot.W).Level > 0,
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W) / 6
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Fizz", IsActive = (source, target) => source.HasBuff("FizzSeastonePassive"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- /*
- #region Gangplank
-
- p = new PassiveDamage
- {
- ChampionName = "Gangplank",
- IsActive = (source, target) => source.HasBuff("gangplankpassiveattack"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.True,
- 20 + (10 * source.Level) + source.FlatPhysicalDamageMod)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-*/
-
- #region Garen
-
- p = new PassiveDamage
- {
- ChampionName = "Garen", IsActive = (source, target) => source.HasBuff("GarenQ"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Gnar
-
- p = new PassiveDamage
- {
- ChampionName = "Gnar", IsActive = (source, target) => (target.GetBuffCount("gnarwproc") == 2),
- GetDamage = (source, target) => ((float)source.GetSpellDamage(target, SpellSlot.W)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Gragas
-
- p = new PassiveDamage
- {
- ChampionName = "Gragas", IsActive = (source, target) => source.HasBuff("gragaswattackbuff"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Graves
-
- p = new PassiveDamage
- {
- ChampionName = "Graves", IsActive = (source, target) => true,
- GetDamage =
- (source, target) =>
- (float)
- (((72 + 3 * source.Level) / 100f)
- * source.CalcDamage(target, DamageType.Physical, source.TotalAttackDamage)
- - source.CalcDamage(target, DamageType.Physical, source.TotalAttackDamage)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Hecarim
-
- p = new PassiveDamage
- {
- ChampionName = "Hecarim", IsActive = (source, target) => source.HasBuff("hecarimrampspeed"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Illaoi
-
- p = new PassiveDamage
- {
- ChampionName = "Illaoi", IsActive = (source, target) => source.HasBuff("IllaoiW"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Irelia
-
- p = new PassiveDamage
- {
- ChampionName = "Irelia", IsActive = (source, target) => source.HasBuff("ireliahitenstylecharged"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region JarvanIV
-
- p = new PassiveDamage
- {
- ChampionName = "JarvanIV",
- IsActive = (source, target) => !target.HasBuff("jarvanivmartialcadencecheck"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(target, DamageType.Physical, Math.Min(target.Health * 0.1, 400))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Jax
-
- p = new PassiveDamage
- {
- ChampionName = "Jax", IsActive = (source, target) => source.HasBuff("JaxEmpowerTwo"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Jayce
-
- p = new PassiveDamage
- {
- ChampionName = "Jayce",
- IsActive =
- (source, target) =>
- Math.Abs(source.Crit - 1) < float.Epsilon && !source.HasBuff("jaycehypercharge"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- source.GetCritMultiplier() * source.TotalAttackDamage)
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Jayce", IsActive = (source, target) => source.HasBuff("jaycehypercharge"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W, 1)
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Jayce", IsActive = (source, target) => source.HasBuff("jaycepassivemeleeattack"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.R)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Jhin
-
- p = new PassiveDamage
- {
- ChampionName = "Jhin", IsActive = (source, target) => (source.HasBuff("jhinpassiveattackbuff")),
- GetDamage =
- (source, target) =>
- ((float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- source.TotalAttackDamage * 0.5f
- + (target.MaxHealth - target.Health)
- * new float[] { 0.15f, 0.20f, 0.25f }[Math.Min(2, (source.Level - 1) / 5)])),
- };
- AttackPassives.Add(p);
-
- p = new PassiveDamage()
- {
- ChampionName = "Jhin", IsActive = (source, target) => Math.Abs(source.Crit - 1) < float.Epsilon,
- GetDamage =
- (source, target) =>
- (float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- (Items.HasItem((int)ItemId.Infinity_Edge, source) ? 0.875 : 0.5)
- * (source.TotalAttackDamage
- * (1
- + (new[] { 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40 }[
- source.Level - 1] + (Math.Floor(source.Crit * 100 / 10) * 4)
- + (Math.Floor((source.AttackSpeedMod - 1) * 100 / 10) * 2.5)) / 100)))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Jinx
-
- p = new PassiveDamage
- {
- ChampionName = "Jinx", IsActive = (source, target) => (source.HasBuff("JinxQ")),
- GetDamage =
- (source, target) =>
- ((float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- 0.1d * (source.BaseAttackDamage + source.FlatPhysicalDamageMod))),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Kalista
-
- p = new PassiveDamage
- {
- ChampionName = "Kalista",
- IsActive = (source, target) => target.HasBuff("kalistacoopstrikemarkally"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = string.Empty,
- IsActive =
- (source, target) =>
- target.HasBuff("kalistacoopstrikemarkbuff") && source.HasBuff("kalistacoopstrikeally"),
- GetDamage =
- (source, target) =>
- ((Obj_AI_Hero)target.GetBuff("kalistacoopstrikemarkbuff").Caster).GetSpellDamage(
- target,
- SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Kassadin
-
- p = new PassiveDamage
- {
- ChampionName = "Kassadin", IsActive = (source, target) => source.GetSpell(SpellSlot.W).Level > 0,
- GetDamage =
- (source, target) =>
- source.GetSpellDamage(target, SpellSlot.W, source.HasBuff("NetherBlade") ? 1 : 0)
- };
-
- #endregion
-
- #region Katarina
-
- p = new PassiveDamage
- {
- ChampionName = "Katarina", IsActive = (source, target) => (target.HasBuff("katarinaqmark")),
- GetDamage = (source, target) => ((float)source.GetSpellDamage(target, SpellSlot.Q, 1)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Kayle
-
- p = new PassiveDamage
- {
- ChampionName = "Kayle", IsActive = (source, target) => source.GetSpell(SpellSlot.E).Level > 0,
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Kennen
-
- p = new PassiveDamage
- {
- ChampionName = "Kennen", IsActive = (source, target) => source.HasBuff("kennendoublestrikelive"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region KhaZix
-
- p = new PassiveDamage
- {
- ChampionName = "KhaZix",
- IsActive =
- (source, target) =>
- source.HasBuff("khazixpdamage") && target.Type == GameObjectType.obj_AI_Hero,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- 10
- + ((source.Level < 6 ? 5 : (source.Level < 11 ? 10 : (source.Level < 14 ? 15 : 20)))
- * source.Level) + (0.5 * source.TotalMagicalDamage))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Kindred
-
- p = new PassiveDamage
- {
- ChampionName = "Kindred",
- IsActive =
- (source, target) =>
- source.HasBuff("KindredLegendPassive")
- && source.GetBuffCount("kindredmarkofthekindredstackcounter") > 0,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- Math.Min(
- (0.125 * source.GetBuffCount("kindredmarkofthekindredstackcounter")) * target.Health,
- target is Obj_AI_Minion
- ? 75 + (10 * source.GetBuffCount("kindredmarkofthekindredstackcounter"))
- : target.MaxHealth))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region KogMaw
-
- p = new PassiveDamage
- {
- ChampionName = "KogMaw", IsActive = (source, target) => (source.HasBuff("KogMawBioArcaneBarrage")),
- GetDamage = (source, target) => ((float)source.GetSpellDamage(target, SpellSlot.W)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Leona
-
- p = new PassiveDamage
- {
- ChampionName = string.Empty,
- IsActive =
- (source, target) =>
- target.HasBuff("leonasunlight")
- && target.GetBuff("leonasunlight").Caster.NetworkId != source.NetworkId,
- GetDamage = (source, target) =>
- {
- var lvl = ((Obj_AI_Hero)target.GetBuff("leonasunlight").Caster).Level - 1;
- if ((lvl / 2) % 1 > 0)
- {
- lvl -= 1;
- }
- return source.CalcDamage(target, DamageType.Magical, 20 + (15 * lvl / 2));
- }
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Leona", IsActive = (source, target) => source.HasBuff("LeonaShieldOfDaybreak"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Lucian
-
- p = new PassiveDamage
- {
- ChampionName = "Lucian", IsActive = (source, target) => source.HasBuff("lucianpassivebuff"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- ((target.Type == GameObjectType.obj_AI_Minion
- ? 1
- : (source.Level < 6
- ? 0.3
- : (source.Level < 11 ? 0.4 : (source.Level < 16 ? 0.5 : 0.6))))
- * source.TotalAttackDamage) * source.GetCritMultiplier(true))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Lux
-
- p = new PassiveDamage
- {
- ChampionName = "Lux", IsActive = (source, target) => target.HasBuff("LuxIlluminatingFraulein"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- 10 + (8 * source.Level) + (0.2 * source.TotalMagicalDamage))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Malphite
-
- p = new PassiveDamage
- {
- ChampionName = "Malphite", IsActive = (source, target) => source.HasBuff("malphitecleave"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region MasterYi
-
- p = new PassiveDamage
- {
- ChampionName = "MasterYi", IsActive = (source, target) => source.HasBuff("doublestrike"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- (0.5 * source.TotalAttackDamage) * source.GetCritMultiplier(true))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region MonkeyKing
-
- p = new PassiveDamage
- {
- ChampionName = "MonkeyKing",
- IsActive = (source, target) => source.HasBuff("MonkeyKingDoubleAttack"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Mordekaiser
-
- p = new PassiveDamage
- {
- ChampionName = "Mordekaiser",
- IsActive = (source, target) => source.Buffs.Any(x => x.Name.Contains("mordekaisermaceofspades")),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Nami
-
- p = new PassiveDamage
- {
- ChampionName = string.Empty, IsActive = (source, target) => source.HasBuff("NamiE"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- new[] { 25, 40, 55, 70, 85 }[
- ((Obj_AI_Hero)source.GetBuff("NamiE").Caster).Spellbook.GetSpell(SpellSlot.E).Level
- - 1] + (0.2 * ((Obj_AI_Hero)source.GetBuff("NamiE").Caster).TotalMagicalDamage))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Nasus
-
- p = new PassiveDamage
- {
- ChampionName = "Nasus", IsActive = (source, target) => (source.HasBuff("NasusQ")),
- GetDamage = (source, target) => ((float)source.GetSpellDamage(target, SpellSlot.Q)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Nautilus
-
- p = new PassiveDamage
- {
- ChampionName = "Nautilus", IsActive = (source, target) => !target.HasBuff("nautiluspassivecheck"),
- GetDamage =
- (source, target) => source.CalcDamage(target, DamageType.Magical, 2 + (6 * source.Level))
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Nautilus",
- IsActive = (source, target) => source.HasBuff("nautiluspiercinggazeshield"),
- GetDamage =
- (source, target) =>
- source.GetSpellDamage(target, SpellSlot.W)
- / (target.Type == GameObjectType.obj_AI_Hero ? 1 : 2)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Nidalee
-
- p = new PassiveDamage
- {
- ChampionName = "Nidalee", IsActive = (source, target) => source.HasBuff("Takedown"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q, 1)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Noctune
-
- p = new PassiveDamage
- {
- ChampionName = "Nocturne", IsActive = (source, target) => source.HasBuff("nocturneumbrablades"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(target, DamageType.Physical, 0.2 * source.TotalAttackDamage)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Nunu
-
- p = new PassiveDamage
- {
- ChampionName = "Nunu", IsActive = (source, target) => source.HasBuff("nunuqbufflizard"),
- GetDamage =
- (source, target) => source.CalcDamage(target, DamageType.Magical, 0.01 * source.MaxHealth)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Orianna
-
- p = new PassiveDamage
- {
- ChampionName = "Orianna", IsActive = (source, target) => (source.HasBuff("orianaspellsword")),
- GetDamage =
- (source, target) =>
- (float)
- source.CalcDamage(
- target,
- DamageType.Magical,
- (float)0.15 * source.TotalMagicalDamage
- + new float[] { 10, 10, 10, 18, 18, 18, 26, 26, 26, 34, 34, 34, 42, 42, 42, 50, 50, 50 }[
- source.Level - 1]),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Pantheon
-
- p = new PassiveDamage
- {
- ChampionName = "Pantheon",
- IsActive =
- (source, target) =>
- (target.HealthPercent < 15 && source.Spellbook.GetSpell(SpellSlot.E).Level > 0)
- || Math.Abs(source.Crit - 1) < float.Epsilon,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- source.GetCritMultiplier() * source.TotalAttackDamage)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Poppy
-
- p = new PassiveDamage
- {
- ChampionName = "Poppy", IsActive = (source, target) => source.HasBuff("PoppyPassiveBuff"),
- GetDamage =
- (source, target) => source.CalcDamage(target, DamageType.Physical, 10 + (10 * source.Level))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Quinn
-
- p = new PassiveDamage
- {
- ChampionName = "Quinn", IsActive = (source, target) => (target.HasBuff("quinnw")),
- GetDamage =
- (source, target) =>
- ((float)source.CalcDamage(target, DamageType.Physical, 0.5d * source.TotalAttackDamage)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region RekSai
-
- p = new PassiveDamage
- {
- ChampionName = "RekSai", IsActive = (source, target) => source.HasBuff("RekSaiq"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Renekton
-
- p = new PassiveDamage
- {
- ChampionName = "Renekton", IsActive = (source, target) => source.HasBuff("RenektonPreExecute"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Rengar
-
- p = new PassiveDamage
- {
- ChampionName = "Rengar", IsActive = (source, target) => source.HasBuff("rengarqbase"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Rengar", IsActive = (source, target) => source.HasBuff("rengarqemp"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q, 1)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Riven
-
- p = new PassiveDamage
- {
- ChampionName = "Riven",
- IsActive = (source, target) => source.GetBuffCount("rivenpassiveaaboost") > 0,
- GetDamage =
- (source, target) =>
- ((float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- (source.Level < 3
- ? 0.25
- : (source.Level < 6
- ? 0.29167
- : (source.Level < 9
- ? 0.3333
- : (source.Level < 12
- ? 0.375
- : (source.Level < 15
- ? 0.4167
- : (source.Level < 18 ? 0.4583 : 0.5))))))
- * source.TotalAttackDamage)),
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Rumble
-
- p = new PassiveDamage
- {
- ChampionName = "Rumble", IsActive = (source, target) => source.HasBuff("rumbleoverheat"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- 0 + (5 * source.Level) + (0.3 * source.TotalMagicalDamage))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Sejuani
-
- p = new PassiveDamage
- {
- ChampionName = "Sejuani",
- IsActive = (source, target) => source.HasBuff("sejuaninorthernwindsenrage"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Shaco
-
- p = new PassiveDamage
- {
- ChampionName = "Shaco",
- IsActive =
- (source, target) => Math.Abs(source.Crit - 1) < float.Epsilon && !source.HasBuff("Deceive"),
- GetDamage = (source, target) => source.GetCritMultiplier() * source.TotalAttackDamage
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Shaco",
- IsActive = (source, target) => source.IsFacing(target) && !source.IsFacing(target),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- (source.TotalAttackDamage * 0.2) * source.GetCritMultiplier(true))
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Shaco", IsActive = (source, target) => source.HasBuff("Deceive"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- (source.GetCritMultiplier()
- + new[] { -0.6, -0.4, -0.2, 0, 0.2 }[source.Spellbook.GetSpell(SpellSlot.Q).Level - 1])
- * source.TotalAttackDamage)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Shen
-
- p = new PassiveDamage
- {
- ChampionName = "Shen", IsActive = (source, target) => source.HasBuff("shenqbuff"),
- GetDamage = (source, target) =>
- {
- double dmg = 0;
- if (source.HasBuff("shenqbuffweak"))
- {
- dmg = source.GetSpellDamage(target, SpellSlot.Q);
- }
- if (source.HasBuff("shenqbuffstrong"))
- {
- dmg = source.GetSpellDamage(target, SpellSlot.Q, 1);
- }
- return dmg;
- }
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Shyvana
-
- p = new PassiveDamage
- {
- ChampionName = "Shyvana", IsActive = (source, target) => source.HasBuff("ShyvanaDoubleAttack"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Shyvana",
- IsActive =
- (source, target) =>
- source.HasBuff("ShyvanaImmolationAura") || source.HasBuff("shyvanaimmolatedragon"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W) / 4
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Shyvana", IsActive = (source, target) => target.HasBuff("ShyvanaFireballMissile"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E, 1)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Sion
-
- p = new PassiveDamage
- {
- ChampionName = "Sion", IsActive = (source, target) => source.HasBuff("sionpassivezombie"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- Math.Min(
- 0.1 * target.MaxHealth,
- target.Type == GameObjectType.obj_AI_Minion ? 75 : target.MaxHealth))
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Skarner
-
- p = new PassiveDamage
- {
- ChampionName = "Skarner", IsActive = (source, target) => target.HasBuff("skarnerpassivebuff"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E, 1)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Sona
-
- p = new PassiveDamage
- {
- ChampionName = "Sona", IsActive = (source, target) => source.HasBuff("SonaPassiveReady"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- (6
- + ((source.Level < 4
- ? 7
- : (source.Level < 6 ? 8 : (source.Level < 7 ? 9 : (source.Level < 15 ? 10 : 15))))
- * source.Level)) + (0.2 * target.TotalMagicalDamage))
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Sona", IsActive = (source, target) => source.HasBuff("SonaQProcAttacker"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- new[] { 20, 30, 40, 50, 60 }[
- ((Obj_AI_Hero)source.GetBuff("SonaQProcAttacker").Caster).Spellbook.GetSpell(
- SpellSlot.Q).Level - 1]
- + (0.2 * ((Obj_AI_Hero)source.GetBuff("SonaQProcAttacker").Caster).TotalMagicalDamage)
- + new[] { 0, 10, 20, 30 }[
- ((Obj_AI_Hero)source.GetBuff("SonaQProcAttacker").Caster).Spellbook.GetSpell(
- SpellSlot.R).Level])
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region TahmKench
-
- p = new PassiveDamage
- {
- ChampionName = "TahmKench", IsActive = (source, target) => source.GetSpell(SpellSlot.R).Level > 0,
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.R)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Talon
-
- p = new PassiveDamage
- {
- ChampionName = "Talon",
- IsActive =
- (source, target) =>
- target.HasBuffOfType(BuffType.Slow) || target.HasBuffOfType(BuffType.Stun)
- || target.HasBuffOfType(BuffType.Snare) || target.HasBuffOfType(BuffType.Suppression),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- (source.TotalAttackDamage * 0.1) * source.GetCritMultiplier(true))
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Talon", IsActive = (source, target) => source.HasBuff("talonnoxiandiplomacybuff"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Taric
-
- p = new PassiveDamage
- {
- ChampionName = "Taric", IsActive = (source, target) => source.HasBuff("taricgemcraftbuff"),
- GetDamage = (source, target) => source.CalcDamage(target, DamageType.Magical, source.Armor * 0.2)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Teemo
-
- p = new PassiveDamage
- {
- ChampionName = "Teemo", IsActive = (source, target) => (source.HasBuff("ToxicShot")),
- GetDamage =
- (source, target) =>
- ((float)
- source.CalcDamage(
- target,
- DamageType.Magical,
- source.Spellbook.GetSpell(SpellSlot.E).Level * 10 + source.TotalMagicalDamage * 0.3)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Thresh
-
- p = new PassiveDamage
- {
- ChampionName = "Thresh",
- IsActive = (source, target) => source.Buffs.Any(x => x.Name.Contains("threshqpassive")),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E, 1)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Tristana
-
- p = new PassiveDamage
- {
- ChampionName = "Tristana",
- IsActive = (source, target) => target.GetBuffCount("tristanaecharge") == 3,
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.E)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Trundle
-
- p = new PassiveDamage
- {
- ChampionName = "Trundle", IsActive = (source, target) => source.HasBuff("TrundleTrollSmash"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region TwistedFate
-
- p = new PassiveDamage
- {
- ChampionName = "TwistedFate", IsActive = (source, target) => (source.HasBuff("bluecardpreattack")),
- GetDamage =
- (source, target) =>
- (float)source.GetSpellDamage(target, SpellSlot.W)
- - (float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- (source.BaseAttackDamage + source.FlatPhysicalDamageMod)) - 10f,
- };
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "TwistedFate", IsActive = (source, target) => (source.HasBuff("redcardpreattack")),
- GetDamage =
- (source, target) =>
- (float)source.GetSpellDamage(target, SpellSlot.W, 2)
- - (float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- (source.BaseAttackDamage + source.FlatPhysicalDamageMod)) - 10f,
- };
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "TwistedFate", IsActive = (source, target) => (source.HasBuff("goldcardpreattack")),
- GetDamage =
- (source, target) =>
- (float)source.GetSpellDamage(target, SpellSlot.W, 3)
- - (float)
- source.CalcDamage(
- target,
- DamageType.Physical,
- (source.BaseAttackDamage + source.FlatPhysicalDamageMod)) - 10f,
- };
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "TwistedFate",
- IsActive = (source, target) => (source.HasBuff("cardmasterstackparticle")),
- GetDamage = (source, target) => (float)source.GetSpellDamage(target, SpellSlot.E),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Twitch
-
- /*
- p = new PassiveDamage
- {
- ChampionName = "Twitch",
- IsActive = (source, target) => true,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.True,
- (source.Level < 5
- ? 12
- : (source.Level < 9 ? 18 : (source.Level < 13 ? 24 : (source.Level < 17 ? 30 : 36))))
- * Math.Min(target.GetBuffCount("twitchdeadlyvenom") + 1, 6)
- / (target.Type == GameObjectType.obj_AI_Minion ? 1 : 6d))
- };
-
- AttackPassives.Add(p);
- */
-
- #endregion
-
- #region Udyr
-
- p = new PassiveDamage
- {
- ChampionName = "Udyr", IsActive = (source, target) => source.HasBuff("UdyrTigerStance"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Varus
-
- p = new PassiveDamage
- {
- ChampionName = "Varus", IsActive = (source, target) => (source.HasBuff("VarusW")),
- GetDamage = (source, target) => ((float)source.GetSpellDamage(target, SpellSlot.W)),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Vayne
-
- p = new PassiveDamage
- {
- ChampionName = "Vayne", IsActive = (source, target) => (source.HasBuff("vaynetumblebonus")),
- GetDamage = (source, target) => ((float)source.GetSpellDamage(target, SpellSlot.Q)),
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Vayne",
- IsActive = (source, target) => source.GetBuffCount("vaynesilvereddebuff") == 2,
- GetDamage = (source, target) => ((float)source.GetSpellDamage(target, SpellSlot.W)),
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Vi
-
- p = new PassiveDamage
- {
- ChampionName = "Vi", IsActive = (source, target) => target.GetBuffCount("viwproc") == 2,
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Vi", IsActive = (source, target) => source.HasBuff("ViE"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.W)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Viktor
-
- p = new PassiveDamage
- {
- ChampionName = "Viktor",
- IsActive = (source, target) => (source.HasBuff("viktorpowertransferreturn")),
- GetDamage =
- (source, target) =>
- (float)
- source.CalcDamage(
- target,
- DamageType.Magical,
- (float)0.5d * source.TotalMagicalDamage
- + new float[]
- { 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 90, 110, 130, 150, 170, 190, 210 }[
- source.Level - 1]),
- };
- AttackPassives.Add(p);
-
- #endregion
-
- #region Volibear
-
- p = new PassiveDamage
- {
- ChampionName = "Volibear", IsActive = (source, target) => source.HasBuff("VolibearQ"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- p = new PassiveDamage
- {
- ChampionName = "Volibear", IsActive = (source, target) => source.HasBuff("volibearrapllicator"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.R)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Warwick
-
- p = new PassiveDamage
- {
- ChampionName = "Warwick", IsActive = (source, target) => true,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- 2.5 + (source.Level < 10 ? 0.5 : 1) * source.Level)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Yasuo
-
- p = new PassiveDamage
- {
- ChampionName = "Yasuo", IsActive = (source, target) => Math.Abs(source.Crit - 1) < float.Epsilon,
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- (Items.HasItem((int)ItemId.Infinity_Edge, source) ? 1.25 : 0.8) * source.TotalAttackDamage)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Yorick
-
- p = new PassiveDamage
- {
- ChampionName = "Yorick", IsActive = (source, target) => source.HasBuff("YorickUnholySymbiosis"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Physical,
- (0.05
- * MinionManager.GetMinions(float.MaxValue)
- .Count(
- g =>
- g.Team == source.Team
- && (g.Name.Equals("Clyde") || g.Name.Equals("Inky") || g.Name.Equals("Blinky")
- || (g.HasBuff("yorickunholysymbiosis")
- && g.GetBuff("yorickunholysymbiosis").Caster.NetworkId
- == source.NetworkId)))) * source.TotalAttackDamage)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Zed
-
- p = new PassiveDamage
- {
- ChampionName = "Zed",
- IsActive = (source, target) => target.HealthPercent < 50 && !target.HasBuff("ZedPassiveCD"),
- GetDamage =
- (source, target) =>
- source.CalcDamage(
- target,
- DamageType.Magical,
- (source.Level < 7 ? 0.06 : (source.Level < 17 ? 0.08 : 0.1)) * target.MaxHealth)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region Ziggs
-
- p = new PassiveDamage
- {
- ChampionName = "Ziggs", IsActive = (source, target) => (source.HasBuff("ziggsshortfuse")),
- GetDamage =
- (source, target) =>
- (float)
- source.CalcDamage(
- target,
- DamageType.Magical,
- (float)0.3d * source.TotalMagicalDamage
- + new float[]
- { 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, 136, 148, 160 }[
- source.Level - 1]),
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #region XinZhao
-
- p = new PassiveDamage
- {
- ChampionName = "XinZhao", IsActive = (source, target) => source.HasBuff("XenZhaoComboTarget"),
- GetDamage = (source, target) => source.GetSpellDamage(target, SpellSlot.Q)
- };
-
- AttackPassives.Add(p);
-
- #endregion
-
- #endregion
-
- //Synced on -[dte]- 18:53 with patch 4.16 data.
-
- #region Spells
-
- Spells.Add(
- "Aatrox",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.6 * source.FlatPhysicalDamageMod
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 95, 130, 165, 200 }[level]
- + 1 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 110, 145, 180, 215 }[level]
- + 0.6 * source.TotalMagicalDamage
- + 0.6 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 300, 400 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Ahri",
- new List
- {
- //Normal Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 65, 90, 115, 140 }[level]
- + 0.35 * source.TotalMagicalDamage
- },
- //Q Return
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- new double[] { 40, 65, 90, 115, 140 }[level]
- + 0.35 * source.TotalMagicalDamage
- },
- //W => First FF to target
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 65, 90, 115, 140 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //W => Additional FF to already FF target
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 12, 19.5, 27, 34.5, 42 }[level]
- + 0.12 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 95, 130, 165, 200 }[level]
- + 0.50 * source.TotalMagicalDamage
- },
- //R, per dash
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Akali",
- new List
- {
- //Q Initial
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 35, 55, 75, 95, 115 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //Q Detonation
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 45, 70, 95, 120, 145 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 55, 80, 105, 130 }[level]
- + 0.4 * source.TotalMagicalDamage
- + 0.6 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 175, 250 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Alistar",
- new List
- {
- //Q Initial
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 55, 110, 165, 220, 275 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Amumu",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 130, 180, 230, 280 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //W - per second
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 8, 12, 16, 20, 24 }[level]
- + (new[] { 0.01, 0.015, 0.02, 0.025, 0.03 }[level]
- + 0.01 * source.TotalMagicalDamage / 100) * target.MaxHealth
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 100, 125, 150, 175 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Anivia",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 85, 110, 135, 160 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //Q - max
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level] * 2
- + 1 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 55, 85, 115, 145, 175 }[level]
- + 0.5 * source.TotalMagicalDamage)
- * (target.HasBuff("chilled") ? 2 : 1)
- },
- //R - per second
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160 }[level]
- + 0.25 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Annie",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 115, 150, 185, 220 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.85 * source.TotalMagicalDamage
- },
- //R - total
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 275, 400 }[level]
- + new double[] { 10, 15, 20 }[level] /* Aura */
- + new double[] { 50, 75, 100 }[level] /* Tibbers ʕ•͡ᴥ•ʔ */
- + (0.65 + 0.1 + 0.15) * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Ashe",
- new List
- {
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 35, 50, 65, 80 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //R - total
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 250, 425, 600 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //R - Min
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 250, 425, 600 }[level]
- + 1 * source.TotalMagicalDamage) / 2
- },
- });
-
- Spells.Add(
- "Azir",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 65, 85, 105, 125, 145 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //W - Soldier auto attacks
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 55, 60, 75, 80, 90 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 225, 300 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Blitzcrank",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 135, 190, 245, 300 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 250, 375, 500 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Bard",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 125, 170, 215, 260 }[level]
- + 0.65 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Brand",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 110, 140, 170, 200 }[level]
- + 0.55 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 120, 165, 210, 255 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 90, 110, 130, 150 }[level]
- + 0.35 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 200, 300 }[level]
- + 0.25 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Braum",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.025 * source.MaxHealth
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Caitlyn",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 70, 110, 150, 190 }[level]
- + new double[] { 1.3, 1.4, 1.5, 1.6, 1.7 }[level]
- * (source.TotalAttackDamage)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 250, 475, 700 }[level]
- + 2 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Cassiopeia",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 120, 165, 210, 255 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 35, 50, 65, 80 }[level]
- + 0.15 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (48 + 4 * ((Obj_AI_Hero)source).Level)
- + 0.1 * source.TotalMagicalDamage
- + (target.HasBuffOfType(BuffType.Poison)
- ? new double[] { 10, 40, 70, 100, 130 }[level]
- + 0.35 * source.TotalMagicalDamage
- : 0)
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "ChoGath",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 135, 190, 245, 305 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 125, 175, 225, 275 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 35, 50, 65, 80 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- new double[] { 300, 475, 650 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Corki",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 150, 205, 250 }[level]
- + 0.5 * source.TotalMagicalDamage
- + 0.5 * source.FlatPhysicalDamageMod
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
-
- //W - Burn
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical, Stage = 1,
- Damage =
- (source, target, level) =>
- new double[] { 30, 45, 60, 75, 90 }[level]
- + (1.5 * source.FlatPhysicalDamageMod)
- + 0.2 * source.TotalMagicalDamage
- },
-
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 32, 44, 56, 68 }[level]
- + 0.4 * source.FlatPhysicalDamageMod
- },
- //R - Normal missile
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 130, 160 }[level]
- + 0.3 * source.TotalMagicalDamage
- + new double[] { 20, 50, 80 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //R - Big missile
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 195, 240 }[level]
- + 0.45 * source.TotalMagicalDamage
- + new double[] { 30, 75, 120 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- });
-
- Spells.Add(
- "Darius",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new[] { 40, 70, 100, 130, 160 }[level]
- + (new[] { 0.5, 1.1, 1.2, 1.3, 1.4 }[level]
- * source.TotalAttackDamage)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- source.TotalAttackDamage + (0.4 * source.TotalAttackDamage)
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- new double[] { 100, 200, 300 }[level]
- + 0.75 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Diana",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 95, 130, 165, 200 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 22, 34, 46, 58, 70 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- //R - total
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 160, 220 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "DrMundo",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage = (source, target, level) =>
- {
- if (target is Obj_AI_Minion)
- {
- return
- Math.Min(
- new double[] { 300, 350, 400, 450, 500 }[level],
- Math.Max(
- new double[] { 80, 130, 180, 230, 280 }[level],
- new double[] { 15, 17.5, 20, 22.5, 25 }[level]
- / 100 * target.Health));
- }
- return Math.Max(
- new double[] { 80, 130, 180, 230, 280 }[level],
- new double[] { 15, 17.5, 20, 22.5, 25 }[level] / 100
- * target.Health);
- }
- },
- //W - per second
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 35, 50, 65, 80, 95 }[level]
- + 0.2 * source.TotalMagicalDamage
- }
- });
-
- Spells.Add(
- "Draven",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 45, 55, 65, 75, 85 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 105, 140, 175, 210 }[level]
- + 0.5 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 175, 275, 375 }[level]
- + 1.1 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Ekko",
- new List
- {
- // Q - Outgoing
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 75, 90, 105, 120 }[level]
- + 0.1 * source.TotalMagicalDamage
- },
- // Q - Incoming
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 85, 110, 135, 160 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- // W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 195, 240, 285, 330 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- // E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 80, 110, 140, 170 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- // R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 350, 500 }[level]
- + 1.3 * source.TotalMagicalDamage
- }
- });
-
- Spells.Add(
- "Elise",
- new List
- {
- //Q - Human
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 75, 110, 145, 180 }[level]
- + (0.08 + 0.03 / 100 * source.TotalMagicalDamage) * target.Health
- },
- //Q - Spider
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 100, 140, 180, 220 }[level]
- + (0.08 + 0.03 / 100 * source.TotalMagicalDamage)
- * (target.MaxHealth - target.Health)
- },
- //W - Human
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 125, 175, 225, 275 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Evelynn",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 50, 60, 70, 80 }[level]
- + new double[] { 35, 40, 45, 50, 55 }[level] / 100
- * source.TotalMagicalDamage
- + new double[] { 50, 55, 60, 65, 70 }[level] / 100
- * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 1 * source.TotalMagicalDamage + 1 * source.FlatPhysicalDamageMod
- },
- //R - total
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new[] { 0.15, 0.20, 0.25 }[level]
- + 0.01 / 100 * source.TotalMagicalDamage) * target.Health
- },
- });
-
- Spells.Add(
- "Ezreal",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 35, 55, 75, 95, 115 }[level]
- + 0.4 * source.TotalMagicalDamage
- + 1.1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 125, 175, 225, 275 }[level]
- + 0.75 * source.TotalMagicalDamage
- + 0.5 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 350, 500, 650 }[level]
- + 0.9 * source.TotalMagicalDamage + 1 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Fiddlesticks",
- new List
- {
- //W - Per second
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.45 * source.TotalMagicalDamage
- },
- //E - Per bounce
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 65, 85, 105, 125, 145 }[level]
- + 0.45 * source.TotalMagicalDamage
- },
- //R - Per second
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 125, 225, 325 }[level]
- + 0.45 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Fiora",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 65, 75, 85, 95, 105 }[level]
- + new[] { 0.95, 1, 1.05, 1.1, 1.15 }[level]
- * source.FlatPhysicalDamageMod
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 90, 130, 170, 210, 250 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Fizz",
- new List
- {
- //Q - AA excluded.
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 25, 40, 55, 70 }[level]
- + 0.35 * source.TotalMagicalDamage
- },
- //W - Per attack
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 15, 20, 25, 30 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 120, 170, 220, 270 }[level]
- + 0.75 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 325, 450 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Galio",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 135, 190, 245, 300 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //R - max
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 360, 540, 720 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "GangPlank",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 45, 70, 95, 120 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //R - per cannonball
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 70, 90 }[level] + 0.1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Garen",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 55, 80, 105, 130 }[level]
- + 1.4 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 45, 70, 95, 120 }[level]
- + new double[] { 70, 80, 90, 100, 110 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //R - Max damage
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 175, 350, 525 }[level]
- + new[] { 28.57, 33.33, 40 }[level] / 100
- * (target.MaxHealth - target.Health)
- },
- });
-
- Spells.Add(
- "Gnar",
- new List
- {
- //Q - mini
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 5, 35, 65, 95, 125 }[level]
- + 1.15 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //Q - big
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 5, 45, 85, 125, 165 }[level]
- + 1.2 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W - mini
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 15, 25, 35, 45, 55 }[level]
- + 1 * source.TotalMagicalDamage
- + new double[] { 6, 8, 10, 12, 14 }[level] / 100 * target.MaxHealth
- },
- //W - big
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 25, 45, 65, 85, 105 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E - mini
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 60, 100, 140, 180 }[level]
- + source.MaxHealth * 0.06
- },
- //E - big
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 60, 100, 140, 180 }[level]
- + source.MaxHealth * 0.06
- },
- //R - Max damage
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 300, 400 }[level]
- + 0.5 * source.TotalMagicalDamage
- + 0.2 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Gragas",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 50, 80, 110, 140 }[level]
- + 8 / 100f * target.MaxHealth + 0.3 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 130, 180, 230, 280 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 300, 400 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Graves",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 55, 70, 85, 100, 115 }[level]
- + 0.75 * source.FlatPhysicalDamageMod
- },
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 125, 170, 215, 260 }[level]
- + new double[] { 0.4, 0.6, 0.8, 1, 1.2 }[level]
- * source.FlatPhysicalDamageMod
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 110, 160, 210, 260 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R - Max damage
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 250, 400, 550 }[level]
- + 1.5 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Hecarim",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 95, 130, 165, 200 }[level]
- + 0.6 * source.FlatPhysicalDamageMod
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 30, 40, 50, 60 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 75, 110, 145, 180 }[level]
- + 0.5 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Heimerdinger",
- new List
- {
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.45 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 135, 180, 225 }[
- source.Spellbook.GetSpell(SpellSlot.R).Level - 1]
- + 0.45 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 100, 140, 180, 220 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 200, 250 }[
- source.Spellbook.GetSpell(SpellSlot.R).Level - 1]
- + 0.6 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Irelia",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 50, 80, 110, 140 }[level]
- + 1.2 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- new double[] { 15, 30, 45, 60, 75 }[level]
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //R - per blade
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160 }[level]
- + 0.5 * source.TotalMagicalDamage
- + 0.6 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Janna",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 85, 110, 135, 160 }[level]
- + 0.35 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 115, 170, 225, 280 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "JarvanIV",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 1.2 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 325, 450 }[level]
- + 1.5 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Jax",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 1 * source.FlatPhysicalDamageMod + 0.6 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 75, 110, 145, 180 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 75, 100, 125, 150 }[level]
- + 0.5 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 160, 220 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Jayce",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 120, 170, 220, 270, 320 }[level]
- + 1.2 * source.FlatPhysicalDamageMod
- },
- //Q - Melee
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 70, 110, 150, 190, 230 }[level]
- + 1 * source.FlatPhysicalDamageMod
- },
- //W - per second
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new[] { 25, 40, 55, 70, 85, 100 }[level]
- + 0.25 * source.TotalMagicalDamage
- },
-
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new[] { 8, 10.4, 12.8, 15.2, 17.6, 20 }[level] / 100)
- * target.MaxHealth + 1 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Jhin",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 75, 100, 125, 150 }[level]
- + new double[] { 0.3, 0.35, 0.4, 0.45, 0.5 }[level]
- * source.FlatPhysicalDamageMod + 0.6 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 85, 120, 155, 190 }[level]
- + 0.7 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 80, 140, 200, 260 }[level]
- + 1.20 * source.FlatPhysicalDamageMod
- + 1 * source.TotalMagicalDamage
- },
- //R - Normal Shot
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 125, 200 }[level]
- + 0.25 * source.FlatPhysicalDamageMod
- * (1 + (100 - target.HealthPercent) * 1.02)
- },
- //R - Final Shot
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 125, 200 }[level]
- + 0.25 * source.FlatPhysicalDamageMod
- * (1 + (100 - target.HealthPercent) * 1.02) * 2
- + 0.01 * source.FlatCritDamageMod
- },
- });
-
- Spells.Add(
- "Jinx",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage = (source, target, level) => 0.1 * source.TotalAttackDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 60, 110, 160, 210 }[level]
- + 1.4 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 135, 190, 245, 300 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //R - Min
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 25, 35, 45 }[level]
- + new double[] { 25, 30, 35 }[level] / 100
- * (target.MaxHealth - target.Health)
- + 0.1 * source.FlatPhysicalDamageMod
- },
- //R - Max
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 250, 350, 450 }[level]
- + new double[] { 25, 30, 35 }[level] / 100
- * (target.MaxHealth - target.Health)
- + 1 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Karma",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 125, 170, 215, 260 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //Q - mantra
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 125, 170, 215, 260 }[level]
- + new double[] { 25, 75, 125, 175 }[
- source.Spellbook.GetSpell(SpellSlot.R).Level - 1]
- + 0.9 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 110, 160, 210, 260 }[level]
- + 0.9 * source.TotalMagicalDamage
- },
- //W - mantra
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 110, 160, 210, 260 }[level]
- + 0.9 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Karthus",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 40, 60, 80, 100, 120 }[level]
- + 0.3 * source.TotalMagicalDamage) * 2
- },
- //Q - Multi-target
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 60, 80, 100, 120 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 50, 70, 90, 110 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 250, 400, 550 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Kassadin",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 95, 120, 145, 170 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 65, 90, 115, 140 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //W - pasive
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage = (source, target, level) => 20 + 0.1 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 105, 130, 155, 180 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //R - Base
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 100, 120 }[level] + 0.02 * source.MaxMana
- },
- //R - Per Stack
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 50, 60 }[level] + 0.01 * source.MaxMana
- },
- });
-
- Spells.Add(
- "Katarina",
- new List
- {
- //Q - dagger
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 85, 110, 135, 160 }[level]
- + 0.45 * source.TotalMagicalDamage
- },
- //Q - mark
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 15, 30, 45, 60, 75 }[level]
- + 0.15 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 75, 110, 145, 180 }[level]
- + 0.6 * source.FlatPhysicalDamageMod
- + 0.25 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 70, 100, 130, 160 }[level]
- + 0.25 * source.TotalMagicalDamage
- },
- //R - per dagger
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 350, 550, 750 }[level]
- + 3.75 * source.FlatPhysicalDamageMod
- + 2.5 * source.TotalMagicalDamage) / 10
- },
- //R - max
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 350, 550, 750 }[level]
- + 3.75 * source.FlatPhysicalDamageMod
- + 2.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Kayle",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 110, 160, 210, 260 }[level]
- + 1 * source.FlatPhysicalDamageMod + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- source.HasBuff("judicatorrighteousfury")
- ? new double[] { 20, 30, 40, 50, 60 }[level]
- + 0.30 * source.TotalMagicalDamage
- : new double[] { 10, 15, 20, 25, 30 }[level]
- + 0.15 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Kennen",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 115, 155, 195, 235 }[level]
- + 0.75 * source.TotalMagicalDamage
- },
- //W - Passive
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 50, 60, 70, 80 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W - Active
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 65, 95, 125, 155, 185 }[level]
- + 0.55 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 85, 125, 165, 205, 245 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 145, 210 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "KhaZix",
- new List
- {
- //Q - Normal target - UnEvolved
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 95, 120, 145, 170 }[level]
- + 1.2 * source.FlatPhysicalDamageMod
- },
- //Q - Isolated target - UnEvolved
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new[] { 91, 123.5, 156, 188.5, 221 }[level]
- + 1.56 * source.FlatPhysicalDamageMod
- },
- //Q - Normal target - Evolved
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 2, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 95, 120, 145, 170 }[level]
- + 2.24 * source.FlatPhysicalDamageMod
- + 10 * ((Obj_AI_Hero)source).Level
- },
- //Q - Isolated target - Evolved
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 3, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new[] { 91, 123.5, 156, 188.5, 221 }[level]
- + 2.6 * source.FlatPhysicalDamageMod
- + 10 * ((Obj_AI_Hero)source).Level
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 110, 140, 170, 200 }[level]
- + 1 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 65, 100, 135, 170, 205 }[level]
- + 0.2 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "KogMaw",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 130, 180, 230, 280 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage = (source, target, level) =>
- {
- var dmg = (0.02
- + (Math.Truncate(source.TotalMagicalDamage / 100)
- * 0.75)) * target.MaxHealth;
-
- if (target is Obj_AI_Minion && dmg > 100)
- {
- dmg = 100;
- }
-
- return dmg;
- }
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 110, 160, 210, 260 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 70, 110, 150 }[level]
- + 0.65 * source.FlatPhysicalDamageMod
- + 0.25 * source.TotalMagicalDamage)
- * (target.HealthPercent < 25
- ? 3
- : (target.HealthPercent < 50 ? 2 : 1))
- },
- });
-
- Spells.Add(
- "Kalista",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 70, 130, 190, 250 }[level]
- + source.BaseAttackDamage + source.FlatPhysicalDamageMod
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 12, 14, 16, 18, 20 }[level] / 100)
- * target.MaxHealth
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage = (source, target, level) =>
- {
- var count = target.GetBuffCount("kalistaexpungemarker");
- if (count > 0)
- {
- return (new double[] { 20, 30, 40, 50, 60 }[level]
- + 0.6
- * (source.BaseAttackDamage
- + source.FlatPhysicalDamageMod)) +
- // Base damage of E
- ((count - 1)
- * (new double[] { 10, 14, 19, 25, 32 }[level]
- + // Base damage per spear
- new double[] { 0.2, 0.225, 0.25, 0.275, 0.3 }[
- level]
- * (source.BaseAttackDamage
- + source.FlatPhysicalDamageMod)));
- // Damage multiplier per spear
- }
- return 0;
- }
- },
- });
-
- Spells.Add(
- "Kindred",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + (source.BaseAttackDamage + source.FlatPhysicalDamageMod) * 0.2f
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 25, 30, 35, 40, 45 }[level]
- + (source.BaseAttackDamage + source.FlatPhysicalDamageMod) * 0.4f
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 110, 140, 170, 200 }[level]
- + (source.BaseAttackDamage + source.FlatPhysicalDamageMod) * 0.2f
- + target.MaxHealth * 0.05f
- },
- });
-
- Spells.Add(
- "LeBlanc",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 55, 80, 105, 130, 155 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //Q . explosion
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 55, 80, 105, 130, 155 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 85, 125, 165, 205, 245 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 65, 90, 115, 140 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "LeeSin",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 80, 110, 140, 170 }[level]
- + 0.9 * source.FlatPhysicalDamageMod
- },
- //Q - 2nd
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 80, 110, 140, 170 }[level]
- + 0.9 * source.FlatPhysicalDamageMod
- + 0.08 * (target.MaxHealth - target.Health)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 95, 130, 165, 200 }[level]
- + 1 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 400, 600 }[level]
- + 2 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Leona",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 55, 80, 105, 130 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 100, 140, 180, 220 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 100, 140, 180, 220 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 175, 250 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Lissandra",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 100, 130, 160, 190 }[level]
- + 0.65 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Lucian",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 110, 140, 170, 200 }[level]
- + new double[] { 60, 75, 90, 105, 120 }[level] / 100
- * source.FlatPhysicalDamageMod
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 100, 140, 180, 220 }[level]
- + 0.9 * source.TotalMagicalDamage
- },
- //R - per shot
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 50, 60 }[level] + 0.1 * source.TotalMagicalDamage
- + 0.25 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Lulu",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 125, 170, 215, 260 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 110, 140, 170, 200 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Lux",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 100, 150, 200, 250 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 300, 400, 500 }[level]
- + 0.75 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Malphite",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 120, 170, 220, 270 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
-
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 38, 46, 54, 62 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 100, 140, 180, 220 }[level] + 0.3 * source.Armor
- + 0.2 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 300, 400 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Malzahar",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 4, 4.5, 5, 5.5, 6 }[level] / 100
- + 0.01 / 100 * source.TotalMagicalDamage) * target.MaxHealth
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 115, 150, 185, 220 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- //1.5% of the target’s maximum health per 100 ability power, per second
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- 2.5
- * (new double[] { 6, 8, 10 }[level] / 100
- + 0.015 * source.TotalMagicalDamage / 100) * target.MaxHealth
- },
- });
-
- Spells.Add(
- "Maokai",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 9, 10, 11, 12, 13 }[level] / 100
- + 0.03 / 100 * source.TotalMagicalDamage) * target.MaxHealth
- },
- //E - impact
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 60, 80, 100, 120 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //E - explosion
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 150, 200 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "MasterYi",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 25, 60, 95, 130, 165 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- + 0.6 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- new[] { 10, 12.5, 15, 17.5, 20 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- + new double[] { 10, 15, 20, 25, 30 }[level]
- },
- });
-
- Spells.Add(
- "MissFortune",
- new List
- {
- //Q - First target
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 35, 50, 65, 80 }[level]
- + 0.35 * source.TotalMagicalDamage
- + 0.85 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //Q - Second target
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 70, 100, 130, 160 }[level]
- + 0.5 * source.TotalMagicalDamage
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- 0.06 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 115, 150, 185, 220 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //R - per wave
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- 0.75 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- + 0.2 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "MonkeyKing",
- new List //AKA wukong
- {
- //Q - bonus
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 60, 90, 120, 150 }[level]
- + 0.1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level] + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level] + 0.8 * source.FlatPhysicalDamageMod
- },
- //R - per second
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 110, 200 }[level]
- + 1.1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- });
-
- Spells.Add(
- "Mordekaiser",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 110, 140, 170, 200 }[level]
- + 1 * source.FlatPhysicalDamageMod + 0.4 * source.TotalMagicalDamage
- },
- //W - per second
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 24, 38, 52, 66, 80 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R - total
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 24, 29, 34 }[level] / 100
- + 0.04 / 100 * source.TotalMagicalDamage) * target.MaxHealth
- },
- });
-
- Spells.Add(
- "Morgana",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 135, 190, 245, 300 }[level]
- + 0.9 * source.TotalMagicalDamage
- },
- //W - per tick
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 8, 16, 24, 32, 40 }[level]
- + 0.11 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 225, 300 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Nami",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 130, 185, 240, 295 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 25, 40, 55, 70, 85 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Nasus",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (from buff in ObjectManager.Player.Buffs
- where buff.Name == "nasusqstacks"
- select buff.Count).FirstOrDefault()
- + new double[] { 30, 50, 70, 90, 110 }[level]
- },
- //E - Initial
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 55, 95, 135, 175, 215 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //E - per second
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 11, 19, 27, 35, 43 }[level]
- + 0.12 * source.TotalMagicalDamage
- },
- //R - per second
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 3, 4, 5 }[level] / 100
- + 0.01 / 100 * source.TotalMagicalDamage) * target.MaxHealth
- },
- });
-
- Spells.Add(
- "Nautilus",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level]
- + 0.75 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 40, 50, 60, 70 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 100, 140, 180, 220 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //R - main target
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 325, 450 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //R - missile
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 125, 175, 225 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Nidalee",
- new List
- {
- //Q - human - min * 3 = max
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 77.5, 95, 112.5, 130 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //Q - cat
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage = (source, target, level) =>
- {
- var dmg =
- (new double[] { 4, 20, 50, 90 }[
- source.Spellbook.GetSpell(SpellSlot.R).Level - 1]
- + 0.36 * source.TotalMagicalDamage
- + 0.75
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod))
- * ((target.MaxHealth - target.Health) / target.MaxHealth
- * 1.5 + 1);
- dmg *= target.HasBuff("nidaleepassivehunted") ? 1.33 : 1.0;
- return dmg;
- }
- },
- //W - human
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 80, 120, 160, 200 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- //W - cat
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 110, 160, 210 }[
- source.Spellbook.GetSpell(SpellSlot.R).Level - 1]
- + 0.3 * source.TotalMagicalDamage
- },
- //E - cat
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 130, 190, 250 }[
- source.Spellbook.GetSpell(SpellSlot.R).Level - 1]
- + 0.45 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Nocturne",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level]
- + 0.75 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 260 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 1.2 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Nunu",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- new double[] { 400, 550, 700, 850, 1000 }[level]
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 85, 130, 175, 225, 275 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //R - Max Damage
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 625, 875, 1125 }[level]
- + 2.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Olaf",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 1 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.4 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- });
-
- Spells.Add(
- "Orianna",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 225, 300 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Pantheon",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 65, 105, 145, 185, 225 }[level]
- + 1.4 * source.FlatPhysicalDamageMod)
- * ((target.Health / target.MaxHealth < 0.15) ? 2 : 1)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 75, 100, 125, 150 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //E - per strike
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 13, 23, 33, 43, 53 }[level]
- + 0.6 * source.FlatPhysicalDamageMod)
- * ((target is Obj_AI_Hero) ? 2 : 1)
- },
- //R - max
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 400, 700, 1000 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //R - min
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 400, 700, 1000 }[level]
- + 1 * source.TotalMagicalDamage) * 0.5
- },
- });
-
- Spells.Add(
- "Poppy",
- new List
- {
- //Q - single hit
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 35, 55, 75, 95, 115 }[level]
- + 0.80 * source.FlatPhysicalDamageMod + 0.07 * target.MaxHealth
- },
- //Q - both hits
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 70, 110, 150, 190, 230 }[level]
- + 1.6 * source.FlatPhysicalDamageMod + 0.14 * target.MaxHealth)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //E - without colliding
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 70, 90, 110, 130 }[level]
- + 0.5 * source.FlatPhysicalDamageMod
- },
- //E - with colliding
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 100, 140, 180, 220, 260 }[level]
- + 1 * source.FlatPhysicalDamageMod)
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 200, 300, 400 }[level]
- + 0.9 * source.FlatPhysicalDamageMod)
- },
- });
-
- Spells.Add(
- "Quinn",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage = (source, target, level) =>
- {
- var damage = (new double[] { 20, 45, 70, 95, 120 }[level]
- + (new double[] { 0.8, 0.9, 1.0, 1.1, 1.2 }[level]
- * source.TotalAttackDamage)
- + 0.35 * source.TotalMagicalDamage);
- damage += damage * ((100 - target.HealthPercent) / 100);
- return damage;
- }
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 70, 100, 130, 160 }[level]
- + 0.2 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage = (source, target, level) => source.TotalAttackDamage
- },
- });
-
- Spells.Add(
- "Rammus",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 150, 200, 250, 300 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 15, 25, 35, 45, 55 }[level] + 0.1 * source.Armor
- },
- //R - per second
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 65, 130, 195 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Renekton",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.8 * source.FlatPhysicalDamageMod
- },
- //Q - empowered
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.8 * source.FlatPhysicalDamageMod) * 1.5
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 30, 50, 70, 90 }[level]
- + 1.5 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W - empowered
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 10, 30, 50, 70, 90 }[level]
- + 1.5 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod))
- * 1.5
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 60, 90, 120, 150 }[level]
- + 0.9 * source.FlatPhysicalDamageMod
- },
- //E - empowered
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 30, 60, 90, 120, 150 }[level]
- + 0.9 * source.FlatPhysicalDamageMod) * 1.5
- },
- //R - per second
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 60, 120 }[level]
- + 0.1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Rengar",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 60, 90, 120, 150 }[level]
- + new double[] { 0, 5, 10, 15, 20 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //Q - Extra
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 60, 90, 120, 150 }[level]
- + (new double[] { 100, 105, 110, 115, 120 }[level] / 100 - 1)
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 80, 110, 140, 170 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 100, 150, 200, 250 }[level]
- + 0.7 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Riven",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 30, 50, 70, 90 }[level]
- + ((source.BaseAttackDamage + source.FlatPhysicalDamageMod) / 100)
- * new double[] { 40, 45, 50, 55, 60 }[level]
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 80, 110, 140, 170 }[level]
- + 1 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 80, 120, 160 }[level]
- + 0.6 * source.FlatPhysicalDamageMod)
- * ((target.MaxHealth - target.Health) / target.MaxHealth * 2.67 + 1)
- },
- });
-
- Spells.Add(
- "Rumble",
- new List
- {
- //Q - total damage
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 135, 195, 255, 315 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //Q - Danger Zone total damage
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new[] { 112.5, 202.5, 292.5, 382.5, 472.5 }[level]
- + 1.5 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 45, 70, 95, 120, 145 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //E - Danger Zone
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new[] { 67.5, 105, 142.5, 180, 217.5 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R - per second
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 130, 185, 240 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //R - Total
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 650, 925, 1200 }[level]
- + 1.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Ryze",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 60, 85, 110, 135, 160, 185 }[level]
- + 0.45 * source.TotalMagicalDamage
- + 0.03
- * (source.MaxMana - 392.4 - 52 * (source as Obj_AI_Hero).Level))
- * (1
- + (target.HasBuff("RyzeE")
- ? new double[] { 40, 55, 70, 85, 100 }[
- ObjectManager.Player.Spellbook.GetSpell(SpellSlot.E)
- .Level - 1] / 100
- : 0))
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 100, 120, 140, 160 }[level]
- + 0.2 * source.TotalMagicalDamage
- + 0.01
- * (source.MaxMana - 392.4 - 52 * (source as Obj_AI_Hero).Level)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 75, 100, 125, 150 }[level]
- + 0.3 * source.TotalMagicalDamage
- + 0.02
- * (source.MaxMana - 392.4 - 52 * (source as Obj_AI_Hero).Level)
- },
- });
-
- Spells.Add(
- "Sejuani",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 125, 170, 215, 260 }[level]
- },
-
- //W - AA damage
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new[] { 4, 4.5, 5, 5.5, 6 }[level] / 100 * target.MaxHealth
- },
- //W - Aoe per second
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new[] { 10, 17.5, 25, 32.5, 40 }[level]
- + (new double[] { 4, 6, 8, 10, 12 }[level] / 100) * source.MaxHealth
- + 0.15 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Shaco",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 140, 160, 180, 200, 220 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W - per attack
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 35, 50, 65, 80, 95 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 90, 130, 170, 210 }[level]
- + 1 * source.FlatPhysicalDamageMod + 1 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 300, 450, 600 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Shen",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage = (source, target, level) =>
- {
- var dmg = (new double[] { 3, 3.5, 4, 4.5, 5 }[level]
- + 0.015 * source.TotalMagicalDamage)
- * target.MaxHealth / 100;
- if (target is Obj_AI_Hero)
- {
- return dmg;
- }
- return
- Math.Min(
- new double[] { 30, 50, 70, 90, 110 }[level] + dmg,
- new double[] { 75, 100, 125, 150, 175 }[level]);
- }
- },
- //Q - Enhanced
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Magical,
- Damage = (source, target, level) =>
- {
- var dmg = (new double[] { 5, 5.5, 6, 6.6, 7 }[level]
- + 0.02 * source.TotalMagicalDamage)
- * target.MaxHealth / 100;
- if (target is Obj_AI_Hero)
- {
- return dmg;
- }
- return
- Math.Min(
- new double[] { 30, 50, 70, 90, 110 }[level] + dmg,
- new double[] { 75, 100, 125, 150, 175 }[level]);
- }
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 85, 120, 155, 190 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Shyvana",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 85, 90, 95, 100 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W - per second
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 35, 50, 65, 80 }[level]
- + 0.2 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 100, 140, 180, 220 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 175, 300, 425 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Singed",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 22, 34, 46, 58, 70 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 65, 80, 95, 110 }[level]
- + 0.75 * source.TotalMagicalDamage
- + new double[] { 4, 5.5, 7, 8.5, 10 }[level] / 100
- * target.MaxHealth
- },
- });
-
- Spells.Add(
- "Sion",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 40, 60, 80, 100 }[level]
- + 0.6 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 120, 180, 240, 300 }[level]
- + 1.8 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 65, 90, 115, 140 }[level]
- + 0.4 * source.TotalMagicalDamage
- + new double[] { 10, 11, 12, 13, 14 }[level] / 100
- * target.MaxHealth
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 105, 140, 175, 210 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 70, 105, 140, 175, 210 }[level]
- + 0.4 * source.TotalMagicalDamage) * 1.5
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 300, 450 }[level]
- + 0.4 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 150, 300, 450 }[level]
- + 0.4 * source.FlatPhysicalDamageMod) * 2
- },
- });
-
- Spells.Add(
- "Sivir",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 25, 45, 65, 85, 105 }[level]
- + new double[] { 70, 80, 90, 100, 110 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- + 0.5 * source.TotalMagicalDamage
- },
- //W - bounce
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 65, 70, 75, 80 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- });
-
- Spells.Add(
- "Skarner",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 30, 40, 50, 60 }[level]
- + 0.4 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 75, 110, 145, 180 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //R - total
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 20, 60, 100 }[level]
- + 0.5 * source.TotalMagicalDamage)
- + (0.60 * source.TotalAttackDamage)
- },
- });
-
- Spells.Add(
- "Sona",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 70, 100, 130, 160 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Soraka",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.35 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Swain",
- new List
- {
- //Q - per second
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 25, 40, 55, 70, 85 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 80, 110, 140, 170 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //R - per draven
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 70, 90 }[level] + 0.2 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Syndra",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 50, 95, 140, 185, 230 }[level]
- + 0.75 * source.TotalMagicalDamage)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 115, 160, 205, 250 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //R - min damage
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 270, 405, 540 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R - per sphere
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 90, 135, 180 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Talon",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 60, 90, 120, 150 }[level]
- + 0.3 * source.FlatPhysicalDamageMod
- + ((target is Obj_AI_Hero)
- ? (new double[] { 10, 20, 30, 40, 50 }[level]
- + 1 * source.FlatPhysicalDamageMod)
- : 0)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 55, 80, 105, 130 }[level]
- + 0.6 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 120, 170, 220 }[level]
- + 0.75 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Taric",
- new List
- {
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 80, 120, 160, 200 }[level] + 0.2 * source.Armor
- },
- //E - min damage
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 70, 100, 130, 160 }[level]
- + 0.2 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "TahmKench",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 130, 180, 230, 280 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //W - Devour
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- target is Obj_AI_Minion
- ? new double[] { 400, 450, 500, 550, 600 }[level]
- : (new double[] { 0.20, 0.23, 0.26, 0.29, 0.32 }[level]
- + 0.02 * source.TotalMagicalDamage / 100) * target.MaxHealth
- },
- //W - Regugitate
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 150, 200, 250, 300 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Teemo",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 125, 170, 215, 260 }[level]
- + 0.8 * source.TotalMagicalDamage
- },
- //E - total
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 34, 68, 102, 136, 170 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //E - onhit
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 20, 30, 40, 50 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //R - total
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 325, 450 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Thresh",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //E - Active
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 65, 95, 125, 155, 185 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 250, 400, 550 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Tristana",
- new List
- {
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 110, 160, 210, 260 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //E - base damage
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 70, 80, 90, 100 }[level]
- + new double[] { 0.5, 0.65, 0.8, 0.95, 1.10 }[level]
- * source.FlatPhysicalDamageMod + 0.5 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 300, 400, 500 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Trundle",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 40, 60, 80, 100 }[level]
- + new[] { 0, 0.5, 0.1, 0.15, 0.2 }[level]
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //R - Total
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new double[] { 20, 24, 28 }[level] / 100
- + 0.02 * source.TotalMagicalDamage / 100) * target.MaxHealth
- },
- });
-
- Spells.Add(
- "Tryndamere",
- new List
- {
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 100, 130, 160, 190 }[level]
- + 1.2 * source.FlatPhysicalDamageMod + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "TwistedFate",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level]
- + 0.65 * source.TotalMagicalDamage
- },
- //W - Blue
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 60, 80, 100, 120 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- + 0.5 * source.TotalMagicalDamage
- },
- //W - Red
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 45, 60, 75, 90 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- + 0.5 * source.TotalMagicalDamage
- },
- //W - Yellow
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 2, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new[] { 15, 22.5, 30, 37.5, 45 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- + 0.5 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 55, 80, 105, 130, 155 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Twitch",
- new List
- {
- //E - current stacks
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (from buff in target.Buffs
- where buff.DisplayName.ToLower() == "twitchdeadlyvenom"
- select buff.Count).FirstOrDefault()
- * (new double[] { 15, 20, 25, 30, 35 }[level]
- + 0.2 * source.TotalMagicalDamage
- + 0.25 * source.FlatPhysicalDamageMod)
- + new double[] { 20, 35, 50, 65, 80 }[level]
- },
- //E - per stack
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 15, 20, 25, 30, 35 }[level]
- + 0.2 * source.TotalMagicalDamage
- + 0.25 * source.FlatPhysicalDamageMod
- + new double[] { 20, 35, 50, 65, 80 }[level]
- },
- });
-
- Spells.Add(
- "Udyr",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 80, 130, 180, 230 }[level]
- + (new double[] { 120, 130, 140, 150, 160 }[level] / 100)
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //R - per wave
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 20, 30, 40, 50 }[level]
- + 0.25 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Urgot",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 40, 70, 100, 130 }[level]
- + 0.85 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 130, 185, 240, 295 }[level]
- + 0.6 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Varus",
- new List
- {
- //Q - min
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 47, 83, 120, 157 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //Q - max
- new DamageSpell
- {
- Slot = SpellSlot.Q, Stage = 1, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 15, 70, 125, 180, 235 }[level]
- + +1.6 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W - on hit
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 10, 14, 18, 22, 26 }[level]
- + 0.25 * source.TotalMagicalDamage
- },
- //W - per stack
- new DamageSpell
- {
- Slot = SpellSlot.W, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- (new[] { 2, 2.75, 3.5, 4.25, 5 }[level] / 100
- + 0.02 * source.TotalMagicalDamage / 100) * target.MaxHealth
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 65, 100, 135, 170, 205 }[level]
- + 0.6 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 175, 250 }[level]
- + 1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Vayne",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 35, 40, 45, 50 }[level] / 100
- * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- Math.Max(
- new double[] { 40, 60, 80, 100, 120 }[level],
- (new double[] { 6, 7.5, 9, 10.5, 12 }[level] / 100)
- * target.MaxHealth)
- },
-
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 45, 80, 115, 150, 185 }[level]
- + 0.5 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Veigar",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 125, 170, 215, 260 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 120, 170, 220, 270, 320 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) => new double[] { 175, 250, 325 }[level]
- // TODO: figure out how fast it scales, 175-350/250-500/325-650 (based on target’s missing health)
- + 0.8 * target.TotalMagicalDamage
- + 0.75 * source.TotalMagicalDamage
- //0.75 - 1.5 ability power (based on target’s missing health)
- },
- });
-
- Spells.Add(
- "Velkoz",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //W - Max
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 50, 70, 90, 110 }[level]
- + new double[] { 45, 75, 105, 135, 165 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 100, 130, 160, 190 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //R - max
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.True,
- Damage =
- (source, target, level) =>
- target.HasBuff("velkozresearchedstack")
- ? new double[] { 500, 725, 950 }[level]
- + 1 * source.TotalMagicalDamage
- : source.CalcDamage(
- target,
- DamageType.Magical,
- new double[] { 500, 725, 950 }[level]
- + 1 * source.TotalMagicalDamage)
- },
- });
-
- Spells.Add(
- "Vi",
- new List
- {
- //Q - min
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 50, 75, 100, 125, 150 }[level]
- + 0.8 * source.FlatPhysicalDamageMod
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new[] { 4, 5.5, 7, 8.5, 10 }[level] / 100
- + 0.01 * source.FlatPhysicalDamageMod / 35) * target.MaxHealth
- },
- //E - extra
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 5, 20, 35, 50, 65 }[level]
- + 1.15 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- + 0.7 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 300, 450 }[level]
- + 1.4 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Viktor",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 80, 100, 120, 140 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 90, 170, 250, 330, 410 }[level]
- + 1.2 * source.TotalMagicalDamage
- },
- //R - summon damage
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 100, 175, 250 }[level]
- + 0.50 * source.TotalMagicalDamage
- },
- //R - per bolt
- new DamageSpell
- {
- Slot = SpellSlot.R, Stage = 1, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Vladimir",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 90, 105, 120, 135 }[level]
- + 0.55 * source.TotalMagicalDamage
- },
- //W - max
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 135, 190, 245, 300 }[level]
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 80, 100, 120, 140 }[level]
- + 0.45 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Volibear",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 60, 90, 120, 150 }[level]
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- (new double[] { 60, 110, 160, 210, 260 }[level])
- * ((target.MaxHealth - target.Health) / target.MaxHealth + 1)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 105, 150, 195, 240 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R - per bolt
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 115, 155 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Warwick",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- Math.Max(
- new double[] { 75, 125, 175, 225, 275 }[level],
- new double[] { 8, 10, 12, 14, 16 }[level] / 100
- * target.MaxHealth) + 1 * source.TotalMagicalDamage
- },
- //R - max
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 150, 250, 350 }[level]
- + 2 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Xerath",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 120, 160, 200, 240 }[level]
- + 0.75 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 110, 140, 170, 200 }[level]
- + 0.45 * source.TotalMagicalDamage
- },
- //R - per charge
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 230, 260 }[level]
- + 0.43 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "XinZhao",
- new List
- {
- //Q - per attack
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 15, 30, 45, 60, 75 }[level]
- + 0.2 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 175, 275 }[level]
- + 1 * source.FlatPhysicalDamageMod + 0.15 * target.Health
- },
- });
-
- Spells.Add(
- "Yasuo",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 20, 40, 60, 80, 100 }[level]
- + 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //E - min
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 90, 110, 130, 150 }[level]
- + 0.6 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 200, 300, 400 }[level]
- + 1.5 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Yorick",
- new List
- {
- //Q - extra
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 30, 60, 90, 120, 150 }[level]
- + 1.2 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 95, 130, 165, 200 }[level]
- + 1 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 55, 85, 115, 145, 175 }[level]
- + 1 * source.FlatPhysicalDamageMod
- },
- });
-
- Spells.Add(
- "Zac",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 110, 150, 190, 230 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 55, 70, 85, 100 }[level]
- + (new double[] { 4, 5, 6, 7, 8 }[level] / 100
- + 0.02 * source.TotalMagicalDamage / 100) * target.MaxHealth
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 80, 130, 180, 230, 280 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- //R - per bounce
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 140, 210, 280 }[level]
- + 0.4 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Zed",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 115, 155, 195, 235 }[level]
- + 1 * source.FlatPhysicalDamageMod
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.8 * source.FlatPhysicalDamageMod
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Physical,
- Damage =
- (source, target, level) =>
- 1 * (source.BaseAttackDamage + source.FlatPhysicalDamageMod)
- },
- });
-
- Spells.Add(
- "Ziggs",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 75, 120, 165, 210, 255 }[level]
- + 0.65 * source.TotalMagicalDamage
- },
- //W
- new DamageSpell
- {
- Slot = SpellSlot.W, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 70, 105, 140, 175, 210 }[level]
- + 0.35 * source.TotalMagicalDamage
- },
- //E - per mine
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 40, 65, 90, 115, 140 }[level]
- + 0.3 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 300, 450, 600 }[level]
- + 1.1 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Zilean",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 90, 145, 200, 260, 320 }[level]
- + 0.9 * source.TotalMagicalDamage
- },
- });
-
- Spells.Add(
- "Zyra",
- new List
- {
- //Q
- new DamageSpell
- {
- Slot = SpellSlot.Q, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 90, 120, 150, 180 }[level]
- + 0.55 * source.TotalMagicalDamage
- },
- //E
- new DamageSpell
- {
- Slot = SpellSlot.E, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 60, 95, 130, 165, 200 }[level]
- + 0.5 * source.TotalMagicalDamage
- },
- //R
- new DamageSpell
- {
- Slot = SpellSlot.R, DamageType = DamageType.Magical,
- Damage =
- (source, target, level) =>
- new double[] { 180, 265, 350 }[level]
- + 0.7 * source.TotalMagicalDamage
- },
- });
-
- #endregion
- }
-
- #endregion
-
- #region Enums
-
- ///
- /// Represents items that deal damage.
- ///
- public enum DamageItems
- {
- ///
- /// The hexgun
- ///
- Hexgun,
-
- ///
- /// The Dfg
- ///
- Dfg,
-
- ///
- /// The botrk
- ///
- Botrk,
-
- ///
- /// The bilgewater
- ///
- Bilgewater,
-
- ///
- /// The tiamat
- ///
- Tiamat,
-
- ///
- /// The hydra
- ///
- Hydra,
-
- ///
- /// The black fire torch
- ///
- BlackFireTorch,
-
- ///
- /// The oding veils
- ///
- OdingVeils,
-
- ///
- /// The frost queen claim
- ///
- FrostQueenClaim,
-
- ///
- /// The liandrys torment
- ///
- LiandrysTorment,
- }
-
- ///
- /// The type of damage.
- ///
- public enum DamageType
- {
- ///
- /// Physical damage. (AD)
- ///
- Physical,
-
- ///
- /// Magical damage. (AP)
- ///
- Magical,
-
- ///
- /// True damage
- ///
- True
- }
-
- ///
- /// Represnets summoner spells that deal damage.
- ///
- public enum SummonerSpell
- {
- ///
- /// The ignite spell.
- ///
- Ignite,
-
- ///
- /// The smite spell.
- ///
- Smite,
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Calculates the damage.
- ///
- /// The source.
- /// The target.
- /// Type of the damage.
- /// The amount.
- ///
- public static double CalcDamage(
- this Obj_AI_Base source,
- Obj_AI_Base target,
- DamageType damageType,
- double amount)
- {
- var damage = 0d;
- switch (damageType)
- {
- case DamageType.Magical:
- damage = CalcMagicDamage(source, target, amount);
- break;
- case DamageType.Physical:
- damage = CalcPhysicalDamage(source, target, amount);
- break;
- case DamageType.True:
- damage = amount;
- break;
- }
-
- return Math.Max(damage, 0d);
- }
-
- ///
- /// Gets the automatic attack damage.
- ///
- /// The source.
- /// The target.
- /// if set to true [include passive].
- ///
- public static double GetAutoAttackDamage(
- this Obj_AI_Base source,
- Obj_AI_Base target,
- bool includePassive = false)
- {
- double result = source.TotalAttackDamage;
- var k = 1d;
- if (source.CharData.BaseSkinName == "Kalista")
- {
- k = 0.9d;
- }
- if (source.CharData.BaseSkinName == "Kled" &&
- ObjectManager.Player.Spellbook.GetSpell(SpellSlot.Q).Name == "KledRiderQ")
- {
- k = 0.8d;
- }
-
- if (!includePassive)
- {
- return CalcPhysicalDamage(source, target, result * k);
- }
-
- var reduction = 0d;
-
- var hero = source as Obj_AI_Hero;
- if (hero != null)
- {
- // Spoils of War
- var minionTarget = target as Obj_AI_Minion;
- if (hero.IsMelee() && minionTarget != null && minionTarget.IsEnemy
- && minionTarget.Team != GameObjectTeam.Neutral
- && hero.Buffs.Any(buff => buff.Name == "talentreaperdisplay" && buff.Count > 0))
- {
- if (
- HeroManager.AllHeroes.Any(
- h =>
- h.NetworkId != source.NetworkId && h.Team == source.Team
- && h.Distance(minionTarget.Position) < 1100))
- {
- var value = 0;
-
- if (Items.HasItem(3302, hero))
- {
- value = 200; // Relic Shield
- }
- else if (Items.HasItem(3097, hero))
- {
- value = 240; // Targon's Brace
- }
- else if (Items.HasItem(3401, hero))
- {
- value = 400; // Face of the Mountain
- }
-
- return value + hero.TotalAttackDamage;
- }
- }
-
- //Champions passive damages:
- result +=
- AttackPassives.Where(
- p => (p.ChampionName == "" || p.ChampionName == hero.ChampionName) && p.IsActive(hero, target))
- .Sum(passive => passive.GetDamage(hero, target));
-
- // BotRK
- if (Items.HasItem(3153, hero))
- {
- var d = 0.06 * target.Health;
- if (target is Obj_AI_Minion)
- {
- d = Math.Min(d, 60);
- }
-
- result += d;
- }
- }
-
- var targetHero = target as Obj_AI_Hero;
- if (targetHero != null)
- {
- // Ninja tabi
- if (Items.HasItem(3047, targetHero))
- {
- k *= 0.9d;
- }
-
- // Nimble Fighter
- if (targetHero.ChampionName == "Fizz")
- {
- var f = new int[] { 4, 6, 8, 10, 12, 14 };
- reduction += f[(targetHero.Level - 1) / 3];
- }
- }
-
- //TODO: need to check if there are items or spells in game that reduce magical dmg % or by amount
- if (hero != null && hero.ChampionName == "Corki")
- {
- return CalcMixedDamage(source, target, (result - reduction) * k, result * k);
- }
-
- return CalcPhysicalDamage(source, target, (result - reduction) * k + PassiveFlatMod(source, target));
- }
-
- ///
- /// Calculates the combo damage of the given spell combo on the given target.
- ///
- /// The source object
- /// The target object
- /// SpellType array containing the combo spells
- /// Returns the calculated combo damage
- public static double GetComboDamage(
- this Obj_AI_Hero source,
- Obj_AI_Base target,
- IEnumerable spellCombo)
- {
- return source.GetComboDamage(target, spellCombo.Select(spell => Tuple.Create(spell, 0)).ToArray());
- }
-
- ///
- /// Calculates the combo damage of the given spell combo on the given target respecting the stage type of each spell
- ///
- /// The source object
- /// The target object
- /// SpellType/StageType tuple containing the combo spells
- /// Returns the calculated combo damage
- public static double GetComboDamage(
- this Obj_AI_Hero source,
- Obj_AI_Base target,
- IEnumerable> spellCombo)
- {
- return spellCombo.Sum(spell => source.GetSpellDamage(target, spell.Item1, spell.Item2));
- }
-
- ///
- /// Gets the damage spell.
- ///
- /// The source.
- /// The target.
- /// Name of the spell.
- ///
- public static DamageSpell GetDamageSpell(this Obj_AI_Base source, Obj_AI_Base target, string spellName)
- {
- if (Orbwalking.IsAutoAttack(spellName))
- {
- return new DamageSpell
- {
- DamageType = DamageType.Physical,
- CalculatedDamage = GetAutoAttackDamage(source, target, true),
- };
- }
-
- var hero = source as Obj_AI_Hero;
- if (hero != null)
- {
- return (from spell in hero.Spellbook.Spells
- where String.Equals(spell.Name, spellName, StringComparison.InvariantCultureIgnoreCase)
- select GetDamageSpell(hero, target, spell.Slot)).FirstOrDefault();
- }
-
- return null;
- }
-
- ///
- /// Gets the damage spell.
- ///
- /// The source.
- /// The target.
- /// The slot.
- /// The stage.
- ///
- public static DamageSpell GetDamageSpell(
- this Obj_AI_Hero source,
- Obj_AI_Base target,
- SpellSlot slot,
- int stage = 0)
- {
- if (Spells.ContainsKey(source.ChampionName))
- {
- var spell = Spells[source.ChampionName].FirstOrDefault(s => s.Slot == slot && stage == s.Stage)
- ?? Spells[source.ChampionName].FirstOrDefault(s => s.Slot == slot);
-
- if (spell == null)
- {
- return null;
- }
-
- var rawDamage = spell.Damage(
- source,
- target,
- Math.Max(0, Math.Min(source.Spellbook.GetSpell(slot).Level - 1, 5)));
- spell.CalculatedDamage = CalcDamage(source, target, spell.DamageType, rawDamage);
- return spell;
- }
-
- //Spell not found.
- return null;
- }
-
- ///
- /// Gets the item damage.
- ///
- /// The source.
- /// The target.
- /// The item.
- ///
- public static double GetItemDamage(this Obj_AI_Hero source, Obj_AI_Base target, DamageItems item)
- {
- switch (item)
- {
- case DamageItems.Bilgewater:
- return source.CalcDamage(target, DamageType.Magical, 100);
- case DamageItems.BlackFireTorch:
- return source.CalcDamage(target, DamageType.Magical, target.MaxHealth * 0.2);
- case DamageItems.Botrk:
- return source.CalcDamage(target, DamageType.Physical, target.MaxHealth * 0.1);
- case DamageItems.FrostQueenClaim:
- return source.CalcDamage(target, DamageType.Magical, 50 + 5 * source.Level);
- case DamageItems.Hexgun:
- return source.CalcDamage(target, DamageType.Magical, 150 + 0.4 * source.TotalMagicalDamage);
- case DamageItems.Hydra:
- return source.CalcDamage(
- target,
- DamageType.Physical,
- source.BaseAttackDamage + source.FlatPhysicalDamageMod);
- case DamageItems.OdingVeils:
- return source.CalcDamage(target, DamageType.Magical, 200);
- case DamageItems.Tiamat:
- return source.CalcDamage(
- target,
- DamageType.Physical,
- source.BaseAttackDamage + source.FlatPhysicalDamageMod);
- case DamageItems.LiandrysTorment:
- var d = target.Health * .2f * 3f;
- return (target.CanMove || target.HasBuff("slow")) ? d : d * 2;
- }
- return 1d;
- }
-
- ///
- /// Gets the spell damage.
- ///
- /// The source.
- /// The target.
- /// Name of the spell.
- ///
- public static double GetSpellDamage(this Obj_AI_Base source, Obj_AI_Base target, string spellName)
- {
- var spell = GetDamageSpell(source, target, spellName);
- return spell != null ? spell.CalculatedDamage : 0d;
- }
-
- ///
- /// Gets the spell damage.
- ///
- /// The source.
- /// The target.
- /// The slot.
- /// The stage.
- ///
- public static double GetSpellDamage(this Obj_AI_Hero source, Obj_AI_Base target, SpellSlot slot, int stage = 0)
- {
- var spell = GetDamageSpell(source, target, slot, stage);
- return spell != null ? spell.CalculatedDamage : 0d;
- }
-
- ///
- /// Gets the summoner spell damage.
- ///
- /// The source.
- /// The target.
- /// The summoner spell.
- ///
- public static double GetSummonerSpellDamage(
- this Obj_AI_Hero source,
- Obj_AI_Base target,
- SummonerSpell summonerSpell)
- {
- if (summonerSpell == SummonerSpell.Ignite)
- {
- return 50 + 20 * source.Level - (target.HPRegenRate / 5 * 3);
- }
-
- if (summonerSpell == SummonerSpell.Smite)
- {
- if (target is Obj_AI_Hero)
- {
- var chillingSmite =
- source.Spellbook.Spells.FirstOrDefault(h => h.Name.Equals("s5_summonersmiteplayerganker"));
- var challengingSmite =
- source.Spellbook.Spells.FirstOrDefault(h => h.Name.Equals("s5_summonersmiteduel"));
-
- if (chillingSmite != null)
- {
- return 20 + 8 * source.Level;
- }
-
- if (challengingSmite != null)
-
- {
- return 54 + 6 * source.Level;
- }
- }
-
- return
- new double[]
- { 390, 410, 430, 450, 480, 510, 540, 570, 600, 640, 680, 720, 760, 800, 850, 900, 950, 1000 }[
- source.Level - 1];
- }
-
- return 0d;
- }
-
- ///
- /// Calculates the combo damage of the given spell combo on the given target and returns if that damage would kill the
- /// target.
- ///
- /// The source object
- /// The target object
- /// SpellType array containing the combo spells
- /// true if target is killable, false if not.
- public static bool IsKillable(
- this Obj_AI_Hero source,
- Obj_AI_Base target,
- IEnumerable> spellCombo)
- {
- return GetComboDamage(source, target, spellCombo) > target.Health;
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Calculates the magic damage.
- ///
- /// The source.
- /// The target.
- /// The amount.
- ///
- private static double CalcMagicDamage(Obj_AI_Base source, Obj_AI_Base target, double amount)
- {
- var magicResist = target.SpellBlock;
-
- // Penetration can't reduce magic resist below 0.
- double value;
-
- if (magicResist < 0)
- {
- value = 2 - 100 / (100 - magicResist);
- }
- else if ((magicResist * source.PercentMagicPenetrationMod) - source.FlatMagicPenetrationMod < 0)
- {
- value = 1;
- }
- else
- {
- value = 100 / (100 + (magicResist * source.PercentMagicPenetrationMod) - source.FlatMagicPenetrationMod);
- }
-
- var damage = DamageReductionMod(
- source,
- target,
- PassivePercentMod(source, target, value) * amount,
- DamageType.Magical);
-
- return damage;
- }
-
- ///
- /// Calculates the mixed damage.
- ///
- /// The source.
- /// The target.
- /// The amount of physical damage after modifiers.
- /// The amount of magical damage after modifiers.
- /// % magic dmg
- /// % physical dmg
- /// % trueDmg dmg
- ///
- private static double CalcMixedDamage(
- Obj_AI_Base source,
- Obj_AI_Base target,
- double amountPhysical,
- double amountMagic,
- int magic = 50,
- int physical = 50,
- int trueDmg = 0)
- {
- return CalcMagicDamage(source, target, (amountMagic * magic) / 100)
- + CalcPhysicalDamage(source, target, (amountPhysical * physical) / 100)
- + PassiveFlatMod(source, target) + (amountMagic * trueDmg) / 100;
- }
-
- ///
- /// Calculates the physical damage.
- ///
- /// The source.
- /// The target.
- /// The amount.
- ///
- private static double CalcPhysicalDamage(Obj_AI_Base source, Obj_AI_Base target, double amount)
- {
- double armorPenetrationPercent = source.PercentArmorPenetrationMod;
- double armorPenetrationFlat = source.FlatArmorPenetrationMod;
- double bonusArmorPenetrationMod = source.PercentBonusArmorPenetrationMod;
-
- // Minions return wrong percent values.
- if (source is Obj_AI_Minion)
- {
- armorPenetrationFlat = 0d;
- armorPenetrationPercent = 1d;
- bonusArmorPenetrationMod = 1d;
- }
-
- // Turrets too.
- if (source is Obj_AI_Turret)
- {
- armorPenetrationFlat = 0d;
- armorPenetrationPercent = 1d;
- bonusArmorPenetrationMod = 1d;
- }
-
- if (source is Obj_AI_Turret)
- {
- if (target is Obj_AI_Minion)
- {
- amount *= 1.25;
- if (target.CharData.BaseSkinName.EndsWith("MinionSiege"))
- {
- amount *= 0.7;
- }
-
- return amount;
- }
- }
-
- // Penetration can't reduce armor below 0.
- var armor = target.Armor;
- var bonusArmor = target.Armor - target.CharData.Armor;
-
- double value;
- if (armor < 0)
- {
- value = 2 - 100 / (100 - armor);
- }
- else if ((armor * armorPenetrationPercent) - (bonusArmor * (1 - bonusArmorPenetrationMod))
- - armorPenetrationFlat < 0)
- {
- value = 1;
- }
- else
- {
- value = 100
- / (100 + (armor * armorPenetrationPercent) - (bonusArmor * (1 - bonusArmorPenetrationMod))
- - armorPenetrationFlat);
- }
-
- var damage = DamageReductionMod(
- source,
- target,
- PassivePercentMod(source, target, value) * amount,
- DamageType.Physical);
-
- // Take into account the percent passives, flat passives and damage reduction.
- return damage;
- }
-
- ///
- /// Gets the damage reduction modifier.
- ///
- /// The source.
- /// The target.
- /// The amount.
- /// Type of the damage.
- ///
- private static double DamageReductionMod(
- Obj_AI_Base source,
- Obj_AI_Base target,
- double amount,
- DamageType damageType)
- {
- if (source is Obj_AI_Hero)
- {
- // Exhaust:
- // + Exhausts target enemy champion, reducing their Movement Speed and Attack Speed by 30%, their Armor and Magic Resist by 10, and their damage dealt by 40% for 2.5 seconds.
- if (source.HasBuff("Exhaust"))
- {
- amount *= 0.6d;
- }
-
- // Lament
- // + Phantom Dancer reduces all damage dealt to attacker (if he's attack you) by 12%
- if (source.HasBuff("itemphantomdancerdebuff"))
- {
- var caster = source.GetBuff("itemphantomdancerdebuff").Caster;
- if (caster.NetworkId == target.NetworkId)
- {
- amount *= 0.88d;
- }
- }
- }
-
- var targetHero = target as Obj_AI_Hero;
- if (targetHero != null)
- {
- //Damage Reduction Masteries
-
- //DAMAGE REDUCTION 2 %, increasing to 8 % when near at least one allied champion
- //IN THIS TOGETHER 8 % of the damage that the nearest allied champion would take is dealt to you instead.This can't bring you below 15% health.
- var BondofStones = targetHero.GetMastery(MasteryData.Resolve.BondofStones);
- if (BondofStones != null && BondofStones.IsActive())
- {
- var closebyenemies =
- HeroManager.Enemies.Any(x => x.NetworkId != target.NetworkId && x.Distance(target) <= 500);
- //500 is not the real value
- if (closebyenemies)
- {
- amount *= 0.92d;
- }
- else
- {
- amount *= 0.98d;
- }
- }
-
- // Items:
-
- // Doran's Shield
- // + Blocks 8 damage from single target attacks and spells from champions.
- if (Items.HasItem(1054, targetHero))
- {
- amount -= 8;
- }
-
- // Passives:
-
- // Unbreakable Will
- // + Alistar removes all crowd control effects from himself, then gains additional attack damage and takes 70% reduced physical and magic damage for 7 seconds.
- if (target.HasBuff("Ferocious Howl"))
- {
- amount *= 0.3d;
- }
-
- // Tantrum
- // + Amumu takes reduced physical damage from basic attacks and abilities.
- if (target.HasBuff("Tantrum") && damageType == DamageType.Physical)
- {
- amount -= new[] { 2, 4, 6, 8, 10 }[target.Spellbook.GetSpell(SpellSlot.E).Level - 1];
- }
-
- // Unbreakable
- // + Grants Braum 30% / 32.5% / 35% / 37.5% / 40% damage reduction from oncoming sources (excluding true damage and towers) for 3 / 3.25 / 3.5 / 3.75 / 4 seconds.
- // + The damage reduction is increased to 100% for the first source of champion damage that would be reduced.
- if (target.HasBuff("BraumShieldRaise"))
- {
- amount -= amount
- * new[] { 0.3d, 0.325d, 0.35d, 0.375d, 0.4d }[
- target.Spellbook.GetSpell(SpellSlot.E).Level - 1];
- }
-
- // Idol of Durand
- // + Galio becomes a statue and channels for 2 seconds, Taunt icon taunting nearby foes and reducing incoming physical and magic damage by 50%.
- if (target.HasBuff("GalioIdolOfDurand"))
- {
- amount *= 0.5d;
- }
-
- // Courage
- // + Garen gains a defensive shield for a few seconds, reducing incoming damage by 30% and granting 30% crowd control reduction for the duration.
- if (target.HasBuff("GarenW"))
- {
- amount *= 0.7d;
- }
-
- // Drunken Rage
- // + Gragas takes a long swig from his barrel, disabling his ability to cast or attack for 1 second and then receives 10% / 12% / 14% / 16% / 18% reduced damage for 3 seconds.
- if (target.HasBuff("GragasWSelf"))
- {
- amount -= amount
- * new[] { 0.1d, 0.12d, 0.14d, 0.16d, 0.18d }[
- target.Spellbook.GetSpell(SpellSlot.W).Level - 1];
- }
-
- // Void Stone
- // + Kassadin reduces all magic damage taken by 15%.
- if (target.HasBuff("VoidStone") && damageType == DamageType.Magical)
- {
- amount *= 0.85d;
- }
-
- // Shunpo
- // + Katarina teleports to target unit and gains 15% damage reduction for 1.5 seconds. If the target is an enemy, the target takes magic damage.
- if (target.HasBuff("KatarinaEReduction"))
- {
- amount *= 0.85d;
- }
-
- // Vengeful Maelstrom
- // + Maokai creates a magical vortex around himself, protecting him and allied champions by reducing damage from non-turret sources by 20% for a maximum of 10 seconds.
- if (target.HasBuff("MaokaiDrainDefense") && !(source is Obj_AI_Turret))
- {
- amount *= 0.8d;
- }
-
- // Meditate
- // + Master Yi channels for up to 4 seconds, restoring health each second. This healing is increased by 1% for every 1% of his missing health. Meditate also resets the autoattack timer.
- // + While channeling, Master Yi reduces incoming damage (halved against turrets).
- if (target.HasBuff("Meditate"))
- {
- amount -= amount
- * new[] { 0.5d, 0.55d, 0.6d, 0.65d, 0.7d }[
- target.Spellbook.GetSpell(SpellSlot.W).Level - 1] / (source is Obj_AI_Turret ? 2 : 1);
- }
-
- // Shadow Dash
- // + Shen reduces all physical damage by 50% from taunted enemies.
- if (target.HasBuff("Shen Shadow Dash") && source.HasBuff("Taunt") && damageType == DamageType.Physical)
- {
- amount *= 0.5d;
- }
- }
- return amount;
- }
-
- private static float GetCritMultiplier(this Obj_AI_Hero hero, bool checkCrit = false)
- {
- var crit = Items.HasItem((int)ItemId.Infinity_Edge, hero) ? 1.5f : 1;
- return !checkCrit ? crit : (Math.Abs(hero.Crit - 1) < float.Epsilon ? 1 + crit : 1);
- }
-
- ///
- /// Gets the passive flat modifier.
- ///
- /// The source.
- /// The target.
- ///
- private static double PassiveFlatMod(Obj_AI_Base source, Obj_AI_Base target)
- {
- var value = 0d;
- var hero = source as Obj_AI_Hero;
- var targetHero = target as Obj_AI_Hero;
- // Offensive masteries:
-
- //Fervor of Battle: STACKTIVATE Your basic attacks and spells give you stacks of Fervor for 5 seconds, stacking 10 times. Each stack of Fervor adds 1-8 bonus physical damage to your basic attacks against champions, based on your level.
- if (targetHero != null && hero != null)
- {
- var Fervor = hero.GetMastery(MasteryData.Ferocity.FervorofBattle);
- if (Fervor != null && Fervor.IsActive())
- {
- value += (0.9 + hero.Level * 0.42) * hero.GetBuffCount("MasteryOnHitDamageStacker");
- }
- }
-
- // Defensive masteries:
-
- //Tough Skin DIRT OFF YOUR SHOULDERS You take 2 less damage from champion and monster basic attacks
- if (targetHero != null && (source is Obj_AI_Hero || source is Obj_AI_Minion))
- {
- var Toughskin = targetHero.GetMastery(MasteryData.Resolve.ToughSkin);
- if (Toughskin != null && Toughskin.IsActive())
- {
- value -= 2;
- }
- }
-
- return value;
- }
-
- ///
- /// Gets the passive percent modifier.
- ///
- /// The source.
- /// The target.
- /// The amount.
- ///
- private static double PassivePercentMod(Obj_AI_Base source, Obj_AI_Base target, double amount)
- {
- var SiegeMinionList = new List { "Red_Minion_MechCannon", "Blue_Minion_MechCannon" };
- var NormalMinionList = new List
- {
- "Red_Minion_Wizard", "Blue_Minion_Wizard", "Red_Minion_Basic",
- "Blue_Minion_Basic"
- };
-
- //Minions and towers passives:
- if (source is Obj_AI_Turret)
- {
- //Siege minions receive 70% damage from turrets
- if (SiegeMinionList.Contains(target.CharData.BaseSkinName))
- {
- amount *= 0.7d;
- }
-
- //Normal minions take 114% more damage from towers.
- else if (NormalMinionList.Contains(target.CharData.BaseSkinName))
- {
- amount *= 1.14285714285714d;
- }
- }
-
- // Masteries:
- var hero = source as Obj_AI_Hero;
- var targetHero = target as Obj_AI_Hero;
- if (hero != null)
- {
- // Offensive masteries:
-
- //INCREASED DAMAGE FROM ABILITIES 0.4/0.8/1.2/1.6/2%
- /*
- Mastery sorcery = hero.GetMastery(Ferocity.Sorcery);
- if (sorcery != null && sorcery.IsActive())
- {
- amount *= 1 + ((new double[] { 0.4, 0.8, 1.2, 1.6, 2.0 }[sorcery.Points]) / 100);
- } /*
-
- //MELEE Deal an additional 3 % damage, but receive an additional 1.5 % damage
- //RANGED Deal an additional 2 % damage, but receive an additional 2 % damage
- Mastery DoubleEdgedSword = hero.GetMastery(Ferocity.DoubleEdgedSword);
- if (DoubleEdgedSword != null && DoubleEdgedSword.IsActive())
- {
- amount *= hero.IsMelee() ? 1.03 : 1.02;
- }
-
- /* Bounty Hunter: TAKING NAMES You gain a permanent 1 % damage increase for each unique enemy champion you kill
- Mastery BountyHunter = hero.GetMastery(Ferocity.BountyHunter);
- if (BountyHunter != null && BountyHunter.IsActive())
- {
- //We need a hero.UniqueChampionsKilled or both the sender and the target for ChampionKilled OnNotify Event
- // amount += amount * Math.Min(hero.ChampionsKilled, 5);
- } */
-
- //Opressor: KICK 'EM WHEN THEY'RE DOWN You deal 2.5% increased damage to targets with impaired movement (slows, stuns, taunts, etc)
- var Opressor = hero.GetMastery(MasteryData.Ferocity.Oppresor);
- if (targetHero != null && Opressor != null && Opressor.IsActive() && targetHero.IsMovementImpaired())
- {
- amount *= 1.025;
- }
-
- //Merciless DAMAGE AMPLIFICATION 1 / 2 / 3 / 4 / 5 % increased damage to champions below 40 % health
- if (targetHero != null)
- {
- var Merciless = hero.GetMastery(MasteryData.Cunning.Merciless);
- if (Merciless != null && Merciless.IsActive() && targetHero.HealthPercent < 40)
- {
- amount *= 1 + Merciless.Points / 100f;
- }
- }
-
- //Thunderlord's Decree: RIDE THE LIGHTNING Your 3rd ability or basic attack on an enemy champion shocks them, dealing 10 - 180(+0.2 bonus attack damage)(+0.1 ability power) magic damage in an area around them
- if (false)
- // Need a good way to check if it is 3rd attack (Use OnProcessSpell/SpellBook.OnCast if have to)
- {
- var Thunder = hero.GetMastery(MasteryData.Cunning.ThunderlordsDecree);
- if (Thunder != null && Thunder.IsActive())
- {
- // amount += 10 * hero.Level + (0.2 * hero.FlatPhysicalDamageMod) + (0.1 * hero.TotalMagicalDamage);
- }
- }
- }
-
- if (targetHero != null)
- {
- // Defensive masteries:
-
- // Double edge sword:
- //MELEE Deal an additional 3 % damage, but receive an additional 1.5 % damage
- //RANGED Deal an additional 2 % damage, but receive an additional 2 % damage
- var des = targetHero.GetMastery(MasteryData.Ferocity.DoubleEdgedSword);
- if (des != null && des.IsActive())
- {
- amount *= targetHero.IsMelee() ? 1.015d : 1.02d;
- }
- }
-
- return amount;
- }
-
- #endregion
-
- ///
- /// Represents a damage spell that only occurs with a passive.
- ///
- internal class PassiveDamage
- {
- #region Fields
-
- ///
- /// The champion name
- ///
- public string ChampionName = "";
-
- ///
- /// The get damage delegate.
- ///
- public GetDamageD GetDamage;
-
- ///
- /// The is active delegate.
- ///
- public IsActiveD IsActive;
-
- #endregion
-
- #region Delegates
-
- ///
- /// Gets the damage dealts to the unit.
- ///
- /// The source.
- /// The target.
- ///
- public delegate double GetDamageD(Obj_AI_Hero source, Obj_AI_Base target);
-
- ///
- /// Gets whether this instance is active.
- ///
- /// The source.
- /// The target.
- ///
- public delegate bool IsActiveD(Obj_AI_Hero source, Obj_AI_Base target);
-
- #endregion
- }
- }
-}
\ No newline at end of file
diff --git a/Dash.cs b/Dash.cs
deleted file mode 100644
index 966becbd..00000000
--- a/Dash.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System.Collections.Generic;
- using System.Linq;
-
- using SharpDX;
-
- ///
- /// Gets information about dashes, and provides events.
- ///
- public static class Dash
- {
- #region Static Fields
-
- ///
- /// The detected dashes
- ///
- private static readonly Dictionary DetectedDashes = new Dictionary();
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes static members of the class.
- ///
- static Dash()
- {
- Initialize();
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Gets the dash information.
- ///
- /// The unit.
- ///
- public static DashItem GetDashInfo(this Obj_AI_Base unit)
- {
- return DetectedDashes.ContainsKey(unit.NetworkId) ? DetectedDashes[unit.NetworkId] : new DashItem();
- }
-
- public static void Initialize()
- {
- Obj_AI_Base.OnNewPath += ObjAiHeroOnOnNewPath;
- }
-
- ///
- /// Determines whether this instance is dashing.
- ///
- /// The unit.
- ///
- public static bool IsDashing(this Obj_AI_Base unit)
- {
- if (DetectedDashes.ContainsKey(unit.NetworkId) && unit.Path.Length != 0)
- {
- return DetectedDashes[unit.NetworkId].EndTick != 0;
- }
- return false;
- }
-
- public static void Shutdown()
- {
- Obj_AI_Base.OnNewPath -= ObjAiHeroOnOnNewPath;
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Fired when a unit changes paths.
- ///
- /// The sender.
- /// The instance containing the event data.
- private static void ObjAiHeroOnOnNewPath(Obj_AI_Base sender, GameObjectNewPathEventArgs args)
- {
- if (sender.IsValid())
- {
- if (!DetectedDashes.ContainsKey(sender.NetworkId))
- {
- DetectedDashes.Add(sender.NetworkId, new DashItem());
- }
-
- if (args.IsDash)
- {
- var path = new List { sender.ServerPosition.To2D() };
- path.AddRange(args.Path.ToList().To2D());
-
- DetectedDashes[sender.NetworkId].StartTick = Utils.TickCount;
- DetectedDashes[sender.NetworkId].Speed = args.Speed;
- DetectedDashes[sender.NetworkId].StartPos = sender.ServerPosition.To2D();
- DetectedDashes[sender.NetworkId].Unit = sender;
- DetectedDashes[sender.NetworkId].Path = path;
- DetectedDashes[sender.NetworkId].EndPos = DetectedDashes[sender.NetworkId].Path.Last();
- DetectedDashes[sender.NetworkId].EndTick = DetectedDashes[sender.NetworkId].StartTick
- + (int)
- (1000
- * (DetectedDashes[sender.NetworkId].EndPos.Distance(
- DetectedDashes[sender.NetworkId].StartPos)
- / DetectedDashes[sender.NetworkId].Speed));
- DetectedDashes[sender.NetworkId].Duration = DetectedDashes[sender.NetworkId].EndTick
- - DetectedDashes[sender.NetworkId].StartTick;
-
- CustomEvents.Unit.TriggerOnDash(
- DetectedDashes[sender.NetworkId].Unit,
- DetectedDashes[sender.NetworkId]);
- }
- else
- {
- DetectedDashes[sender.NetworkId].EndTick = 0;
- }
- }
- }
-
- #endregion
-
- ///
- /// Represents a dash.
- ///
- public class DashItem
- {
- #region Fields
-
- ///
- /// The duration
- ///
- public int Duration;
-
- ///
- /// The end position
- ///
- public Vector2 EndPos;
-
- ///
- /// The end tick
- ///
- public int EndTick;
-
- ///
- /// true if the dash was a blink, else false
- ///
- public bool IsBlink;
-
- ///
- /// The path
- ///
- public List Path;
-
- ///
- /// The speed
- ///
- public float Speed;
-
- ///
- /// The start position
- ///
- public Vector2 StartPos;
-
- ///
- /// The start tick
- ///
- public int StartTick;
-
- ///
- /// The unit
- ///
- public Obj_AI_Base Unit;
-
- #endregion
- }
- }
-}
\ No newline at end of file
diff --git a/GamePacket.cs b/GamePacket.cs
deleted file mode 100644
index 76af9cc3..00000000
--- a/GamePacket.cs
+++ /dev/null
@@ -1,573 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.IO;
- using System.Linq;
- using System.Text;
-
- using SharpDX;
-
- ///
- /// This class makes easier to handle packets.
- ///
- public class GamePacket
- {
- #region Fields
-
- ///
- /// The channel
- ///
- public PacketChannel Channel = PacketChannel.C2S;
-
- ///
- /// The flags
- ///
- public PacketProtocolFlags Flags = PacketProtocolFlags.Reliable;
-
- ///
- /// The _header
- ///
- private readonly byte _header;
-
- ///
- /// The binary reader.
- ///
- private readonly BinaryReader Br;
-
- ///
- /// The binary writer
- ///
- private readonly BinaryWriter Bw;
-
- ///
- /// The memory stream.
- ///
- private readonly MemoryStream Ms;
-
- ///
- /// The raw packet
- ///
- private readonly byte[] rawPacket;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The data.
- public GamePacket(byte[] data)
- {
- this.Block = false;
- this.Ms = new MemoryStream(data);
- this.Br = new BinaryReader(this.Ms);
- this.Bw = new BinaryWriter(this.Ms);
-
- this.Br.BaseStream.Position = 0;
- this.Bw.BaseStream.Position = 0;
- this.rawPacket = data;
- this._header = data[0];
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The instance containing the event data.
- public GamePacket(GamePacketEventArgs args)
- {
- this.Block = false;
- this.Ms = new MemoryStream(args.PacketData);
- this.Br = new BinaryReader(this.Ms);
- this.Bw = new BinaryWriter(this.Ms);
-
- this.Br.BaseStream.Position = 0;
- this.Bw.BaseStream.Position = 0;
- this.rawPacket = args.PacketData;
- this._header = args.PacketData[0];
- this.Channel = args.Channel;
- this.Flags = args.ProtocolFlag;
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The header.
- /// The channel.
- /// The flags.
- public GamePacket(
- byte header,
- PacketChannel channel = PacketChannel.C2S,
- PacketProtocolFlags flags = PacketProtocolFlags.Reliable)
- {
- this.Block = false;
- this.Ms = new MemoryStream();
- this.Br = new BinaryReader(this.Ms);
- this.Bw = new BinaryWriter(this.Ms);
-
- this.Br.BaseStream.Position = 0;
- this.Bw.BaseStream.Position = 0;
- this.WriteByte(header);
- this._header = header;
- this.Channel = channel;
- this.Flags = flags;
- }
-
- #endregion
-
- #region Public Properties
-
- ///
- /// Gets or sets a value indicating whether this is block.
- ///
- ///
- /// true if block; otherwise, false.
- ///
- public bool Block { get; set; }
-
- ///
- /// Gets the header.
- ///
- ///
- /// The header.
- ///
- public byte Header
- {
- get
- {
- return this.ReadByte(0);
- } //Better in case header changes, but also resets position.
- }
-
- ///
- /// Gets or sets the position.
- ///
- ///
- /// The position.
- ///
- public long Position
- {
- get
- {
- return this.Br.BaseStream.Position;
- }
- set
- {
- if (value >= 0L)
- {
- this.Br.BaseStream.Position = value;
- }
- }
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Dumps the packet.
- ///
- /// if set to true writes additional information.
- ///
- public string Dump(bool additionalInfo = false)
- {
- var s = string.Concat(this.Ms.ToArray().Select(b => b.ToString("X2") + " "));
- if (additionalInfo)
- {
- s = "Channel: " + this.Channel + " Flags: " + this.Flags + " Data: " + s;
- }
- return s;
- }
-
- ///
- /// Gets the raw packet.
- ///
- ///
- public byte[] GetRawPacket()
- {
- return this.Ms.ToArray();
- }
-
- ///
- /// Receives the packet.
- ///
- /// The channel.
- public void Process(PacketChannel channel = PacketChannel.S2C)
- {
- return; //Blocked for now 4.21
- if (!this.Block)
- {
- Game.ProcessPacket(this.Ms.ToArray(), channel);
- }
- }
-
- ///
- /// Reads a byte from the packet and increases the position by 1.
- ///
- /// The position.
- ///
- public byte ReadByte(long position = -1)
- {
- this.Position = position;
- return this.Br.ReadBytes(1)[0];
- }
-
- ///
- /// Reads and returns a float.
- ///
- /// The position.
- ///
- public float ReadFloat(long position = -1)
- {
- this.Position = position;
- return BitConverter.ToSingle(this.Br.ReadBytes(4), 0);
- }
-
- ///
- /// Reads and returns an integer.
- ///
- /// The position.
- ///
- public int ReadInteger(long position = -1)
- {
- this.Position = position;
- return BitConverter.ToInt32(this.Br.ReadBytes(4), 0);
- }
-
- ///
- /// Reads and returns a double byte.
- ///
- /// The position.
- ///
- public short ReadShort(long position = -1)
- {
- this.Position = position;
- return BitConverter.ToInt16(this.Br.ReadBytes(2), 0);
- }
-
- ///
- /// Reads and returns a string.
- ///
- /// The position.
- ///
- public string ReadString(long position = -1)
- {
- this.Position = position;
- var sb = new StringBuilder();
-
- for (var i = this.Position; i < this.Size(); i++)
- {
- var num = this.ReadByte();
-
- if (num == 0)
- {
- return sb.ToString();
- }
- sb.Append(Convert.ToChar(num));
- }
-
- return sb.ToString();
- }
-
- ///
- /// Saves the packet dump to a file
- ///
- /// The file path.
- public void SaveToFile(string filePath)
- {
- var w = File.AppendText(filePath);
-
- w.WriteLine(this.Dump(true));
- w.Close();
- }
-
- ///
- /// Searches for the byte.
- ///
- /// The number.
- ///
- public int[] SearchByte(byte num)
- {
- //return rawPacket.IndexOf(new byte[num]).ToArray();
- return this.rawPacket.IndexOf(BitConverter.GetBytes(num)).ToArray();
- }
-
- ///
- /// Searches for the float.
- ///
- /// The number.
- ///
- public int[] SearchFloat(float num)
- {
- return this.rawPacket.IndexOf(BitConverter.GetBytes(num)).ToArray();
- }
-
- ///
- /// Searches for the game tile.
- ///
- /// The position.
- ///
- public int[][] SearchGameTile(Vector2 position)
- {
- var tile = NavMesh.WorldToGrid(position.X, position.Y);
- var cell = NavMesh.GetCell((short)tile.X, (short)tile.Y);
-
- var x = this.SearchShort(cell.GridX);
- var y = this.SearchShort(cell.GridY);
-
- return new[] { x, y };
- }
-
- ///
- /// Searches for the game tile.
- ///
- /// The position.
- ///
- public int[][] SearchGameTile(Vector3 position)
- {
- return this.SearchGameTile(position.To2D());
- }
-
- ///
- /// Searches for the game tile.
- ///
- /// The object.
- ///
- public int[][] SearchGameTile(GameObject obj)
- {
- return this.SearchGameTile(obj.Position.To2D());
- }
-
- ///
- /// Searches for the hexadecimal string.
- ///
- /// The hexadecimal string.
- ///
- public int[] SearchHexString(string hex)
- {
- hex = hex.Replace(" ", string.Empty);
-
- if ((hex.Length % 2) != 0)
- {
- hex = "0" + hex;
- }
-
- return
- this.rawPacket.IndexOf(
- Enumerable.Range(0, hex.Length)
- .Where(x => x % 2 == 0)
- .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
- .ToArray()).ToArray();
- }
-
- ///
- /// Searches for the integer.
- ///
- /// The number.
- ///
- public int[] SearchInteger(int num)
- {
- return this.rawPacket.IndexOf(BitConverter.GetBytes(num)).ToArray();
- }
-
- ///
- /// Searches for the object.
- ///
- /// The object.
- ///
- public int[] SearchObject(GameObject obj)
- {
- if (obj == null || !obj.IsValid || obj.NetworkId == 0)
- {
- return null;
- }
-
- return this.SearchInteger(obj.NetworkId);
- }
-
- ///
- /// Searches forthe object.
- ///
- /// The network identifier.
- ///
- public int[] SearchObject(int networkId)
- {
- return networkId == 0 ? null : this.SearchInteger(networkId);
- }
-
- ///
- /// Searches for the position.
- ///
- /// The position.
- ///
- public int[][] SearchPosition(Vector2 position)
- {
- var x = this.SearchFloat(position.X);
- var y = this.SearchFloat(position.Y);
-
- if (x == null || y == null)
- {
- return null;
- }
-
- return new[] { x, y };
- }
-
- ///
- /// Searches for the position.
- ///
- /// The position.
- ///
- public int[][] SearchPosition(Vector3 position)
- {
- return this.SearchPosition(position.To2D());
- }
-
- ///
- /// Searches for the position.
- ///
- /// The unit.
- ///
- public int[][] SearchPosition(GameObject unit)
- {
- return this.SearchPosition(unit.Position.To2D());
- }
-
- ///
- /// Searches for the position.
- ///
- /// The unit.
- ///
- public int[][] SearchPosition(Obj_AI_Base unit)
- {
- var pos = this.SearchPosition(unit.Position.To2D());
- var pos2 = this.SearchPosition(unit.ServerPosition.To2D());
-
- if (pos == null)
- {
- return pos2;
- }
-
- return pos2 == null ? pos : null;
- }
-
- ///
- /// Searches for the short.
- ///
- /// The number.
- ///
- public int[] SearchShort(short num)
- {
- return this.rawPacket.IndexOf(BitConverter.GetBytes(num)).ToArray();
- }
-
- ///
- /// Searches for the string.
- ///
- /// The string.
- ///
- public int[] SearchString(string str)
- {
- return this.rawPacket.IndexOf(Utils.GetBytes(str)).ToArray();
- }
-
- ///
- /// Sends the packet
- ///
- /// The channel.
- /// The flags.
- public void Send(
- PacketChannel channel = PacketChannel.C2S,
- PacketProtocolFlags flags = PacketProtocolFlags.Reliable)
- {
- return; //Blocked for now 4.21
- if (!this.Block)
- {
- Game.SendPacket(
- this.Ms.ToArray(),
- this.Channel == PacketChannel.C2S ? channel : this.Channel,
- this.Flags == PacketProtocolFlags.Reliable ? flags : this.Flags);
- }
- }
-
- ///
- /// Returns the packet size.
- ///
- ///
- public long Size()
- {
- return this.Br.BaseStream.Length;
- }
-
- ///
- /// Writes a byte.
- ///
- /// The byte.
- /// Specifies how many times to write the packet.
- public void WriteByte(byte b, int repeat = 1)
- {
- for (var i = 0; i < repeat; i++)
- {
- this.Bw.Write(b);
- }
- }
-
- ///
- /// Writes a float.
- ///
- /// The float.
- public void WriteFloat(float f)
- {
- this.Bw.Write(f);
- }
-
- ///
- /// Writes the hex string as bytes to the packet.
- ///
- /// The hexadecimal string.
- public void WriteHexString(string hex)
- {
- hex = hex.Replace(" ", string.Empty);
-
- if ((hex.Length % 2) != 0)
- {
- hex = "0" + hex;
- }
-
- this.Bw.Write(
- Enumerable.Range(0, hex.Length)
- .Where(x => x % 2 == 0)
- .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
- .ToArray());
- }
-
- ///
- /// Writes an integer.
- ///
- /// The integer.
- public void WriteInteger(int i)
- {
- this.Bw.Write(i);
- }
-
- ///
- /// Writes a short.
- ///
- /// The short.
- public void WriteShort(short s)
- {
- this.Bw.Write(s);
- }
-
- ///
- /// Writes the string.
- ///
- /// The string.
- public void WriteString(string str)
- {
- this.Bw.Write(Encoding.UTF8.GetBytes(str));
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/Geometry.cs b/Geometry.cs
deleted file mode 100644
index 7d42253b..00000000
--- a/Geometry.cs
+++ /dev/null
@@ -1,1713 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Collections.Generic;
- using System.Linq;
-
- using ClipperLib;
-
- using SharpDX;
-
- using Color = System.Drawing.Color;
-
- ///
- /// Provides methods regarding geometry math.
- ///
- public static class Geometry
- {
- #region Public Methods and Operators
-
- ///
- /// Returns the angle with the vector p2 in degrees;
- ///
- /// The first point.
- /// The second point.
- ///
- public static float AngleBetween(this Vector2 p1, Vector2 p2)
- {
- var theta = p1.Polar() - p2.Polar();
- if (theta < 0)
- {
- theta = theta + 360;
- }
- if (theta > 180)
- {
- theta = 360 - theta;
- }
- return theta;
- }
-
- ///
- /// Returns a Vector2 at center of the polygone.
- ///
- /// The polygon.
- ///
- public static Vector2 CenterOfPolygone(this Polygon p)
- {
- var cX = 0f;
- var cY = 0f;
- var pc = p.Points.Count;
- foreach (var point in p.Points)
- {
- cX += point.X;
- cY += point.Y;
- }
- return new Vector2(cX / pc, cY / pc);
- }
-
- ///
- /// Returns the two intersection points between two circles.
- ///
- /// The center1.
- /// The center2.
- /// The radius1.
- /// The radius2.
- ///
- public static Vector2[] CircleCircleIntersection(Vector2 center1, Vector2 center2, float radius1, float radius2)
- {
- var D = center1.Distance(center2);
- //The Circles dont intersect:
- if (D > radius1 + radius2 || (D <= Math.Abs(radius1 - radius2)))
- {
- return new Vector2[] { };
- }
-
- var A = (radius1 * radius1 - radius2 * radius2 + D * D) / (2 * D);
- var H = (float)Math.Sqrt(radius1 * radius1 - A * A);
- var Direction = (center2 - center1).Normalized();
- var PA = center1 + A * Direction;
- var S1 = PA + H * Direction.Perpendicular();
- var S2 = PA - H * Direction.Perpendicular();
- return new[] { S1, S2 };
- }
-
- ///
- /// Clips the polygons.
- ///
- /// The polygons.
- ///
- public static List> ClipPolygons(List polygons)
- {
- var subj = new List>(polygons.Count);
- var clip = new List>(polygons.Count);
- foreach (var polygon in polygons)
- {
- subj.Add(polygon.ToClipperPath());
- clip.Add(polygon.ToClipperPath());
- }
- var solution = new List>();
- var c = new Clipper();
- c.AddPaths(subj, PolyType.ptSubject, true);
- c.AddPaths(clip, PolyType.ptClip, true);
- c.Execute(ClipType.ctUnion, solution, PolyFillType.pftPositive, PolyFillType.pftEvenOdd);
- return solution;
- }
-
- ///
- /// Checks if the two floats are close to each other.
- ///
- /// a.
- /// The b.
- /// The epsilon.
- ///
- public static bool Close(float a, float b, float eps)
- {
- if (Math.Abs(eps) < float.Epsilon)
- {
- eps = (float)1e-9;
- }
- return Math.Abs(a - b) <= eps;
- }
-
- ///
- /// Returns the closest vector from a list.
- ///
- /// The v.
- /// The v list.
- ///
- public static Vector2 Closest(this Vector2 v, List vList)
- {
- var result = new Vector2();
- var dist = float.MaxValue;
-
- foreach (var vector in vList)
- {
- var distance = Vector2.DistanceSquared(v, vector);
- if (distance < dist)
- {
- dist = distance;
- result = vector;
- }
- }
-
- return result;
- }
-
- ///
- /// Returns the cross product Z value.
- ///
- /// The self.
- /// The other.
- ///
- public static float CrossProduct(this Vector2 self, Vector2 other)
- {
- return other.Y * self.X - other.X * self.Y;
- }
-
- ///
- /// Converts degrees to radians.
- ///
- /// The angle.
- ///
- public static float DegreeToRadian(double angle)
- {
- return (float)(Math.PI * angle / 180.0);
- }
-
- //Obj_AI_Base class extended methods:
- ///
- /// Calculates the 2D distance to the unit.
- ///
- /// Another unit.
- /// if set to true [squared].
- ///
- public static float Distance(Obj_AI_Base anotherUnit, bool squared = false)
- {
- return ObjectManager.Player.Distance(anotherUnit, squared);
- }
-
- ///
- /// Calculates the 2D distance to the unit.
- ///
- /// The unit.
- /// Another unit.
- /// if set to true [squared].
- ///
- public static float Distance(this Obj_AI_Base unit, Obj_AI_Base anotherUnit, bool squared = false)
- {
- return unit.ServerPosition.To2D().Distance(anotherUnit.ServerPosition.To2D(), squared);
- }
-
- ///
- /// Calculates the 2D distance to the unit.
- ///
- /// The unit.
- /// Another unit.
- /// if set to true [squared].
- ///
- public static float Distance(this Obj_AI_Base unit, AttackableUnit anotherUnit, bool squared = false)
- {
- return unit.ServerPosition.To2D().Distance(anotherUnit.Position.To2D(), squared);
- }
-
- ///
- /// Calculates the 2D distance to the point.
- ///
- /// The unit.
- /// The point.
- /// if set to true [squared].
- ///
- public static float Distance(this Obj_AI_Base unit, Vector3 point, bool squared = false)
- {
- return unit.ServerPosition.To2D().Distance(point.To2D(), squared);
- }
-
- ///
- /// Calculates the 2D distance to the point.
- ///
- /// The unit.
- /// The point.
- /// if set to true [squared].
- ///
- public static float Distance(this Obj_AI_Base unit, Vector2 point, bool squared = false)
- {
- return unit.ServerPosition.To2D().Distance(point, squared);
- }
-
- ///
- /// Returns the 2D distance (XY plane) between two vector.
- ///
- /// The v.
- /// The other.
- /// if set to true [squared].
- ///
- public static float Distance(this Vector3 v, Vector3 other, bool squared = false)
- {
- return v.To2D().Distance(other, squared);
- }
-
- ///
- /// Calculates the distance to the Vector2.
- ///
- /// The v.
- /// To.
- /// if set to true gets the distance squared.
- ///
- public static float Distance(this Vector2 v, Vector2 to, bool squared = false)
- {
- return squared ? Vector2.DistanceSquared(v, to) : Vector2.Distance(v, to);
- }
-
- ///
- /// Calculates the distance to the Vector3.
- ///
- /// The v.
- /// To.
- /// if set to true gets the distance squared.
- ///
- public static float Distance(this Vector2 v, Vector3 to, bool squared = false)
- {
- return v.Distance(to.To2D(), squared);
- }
-
- ///
- /// Calculates the distance to the unit.
- ///
- /// The v.
- /// To.
- /// if set to true gets the distance squared.
- ///
- public static float Distance(this Vector2 v, Obj_AI_Base to, bool squared = false)
- {
- return v.Distance(to.ServerPosition.To2D(), squared);
- }
-
- ///
- /// Returns the distance to the line segment.
- ///
- /// The point.
- /// The segment start.
- /// The segment end.
- /// if set to true [only if on segment].
- /// if set to true [squared].
- ///
- public static float Distance(
- this Vector2 point,
- Vector2 segmentStart,
- Vector2 segmentEnd,
- bool onlyIfOnSegment = false,
- bool squared = false)
- {
- var objects = point.ProjectOn(segmentStart, segmentEnd);
-
- if (objects.IsOnSegment || onlyIfOnSegment == false)
- {
- return squared
- ? Vector2.DistanceSquared(objects.SegmentPoint, point)
- : Vector2.Distance(objects.SegmentPoint, point);
- }
- return float.MaxValue;
- }
-
- ///
- /// Calculates the 3D distance to the unit.
- ///
- /// The unit.
- /// Another unit.
- /// if set to true [squared].
- ///
- public static float Distance3D(this Obj_AI_Base unit, Obj_AI_Base anotherUnit, bool squared = false)
- {
- return squared
- ? Vector3.DistanceSquared(unit.Position, anotherUnit.Position)
- : Vector3.Distance(unit.Position, anotherUnit.Position);
- }
-
- ///
- /// Extends the vector.
- ///
- /// The vector.
- /// The vector to extend to
- /// The distance to extend.
- ///
- public static Vector2 Extend(this Vector2 v, Vector2 to, float distance)
- {
- return v + distance * (to - v).Normalized();
- }
-
- ///
- /// Extends the specified vector.
- ///
- /// The vector.
- /// The vector to extend to.
- /// The distance.
- ///
- public static Vector3 Extend(this Vector3 v, Vector3 to, float distance)
- {
- return v + distance * (to - v).Normalized();
- }
-
- //From: http://social.msdn.microsoft.com/Forums/vstudio/en-US/e5993847-c7a9-46ec-8edc-bfb86bd689e3/help-on-line-segment-intersection-algorithm
- ///
- /// Intersects two line segments.
- ///
- /// The line segment1 start.
- /// The line segment1 end.
- /// The line segment2 start.
- /// The line segment2 end.
- ///
- public static IntersectionResult Intersection(
- this Vector2 lineSegment1Start,
- Vector2 lineSegment1End,
- Vector2 lineSegment2Start,
- Vector2 lineSegment2End)
- {
- double deltaACy = lineSegment1Start.Y - lineSegment2Start.Y;
- double deltaDCx = lineSegment2End.X - lineSegment2Start.X;
- double deltaACx = lineSegment1Start.X - lineSegment2Start.X;
- double deltaDCy = lineSegment2End.Y - lineSegment2Start.Y;
- double deltaBAx = lineSegment1End.X - lineSegment1Start.X;
- double deltaBAy = lineSegment1End.Y - lineSegment1Start.Y;
-
- var denominator = deltaBAx * deltaDCy - deltaBAy * deltaDCx;
- var numerator = deltaACy * deltaDCx - deltaACx * deltaDCy;
-
- if (Math.Abs(denominator) < float.Epsilon)
- {
- if (Math.Abs(numerator) < float.Epsilon)
- {
- // collinear. Potentially infinite intersection points.
- // Check and return one of them.
- if (lineSegment1Start.X >= lineSegment2Start.X && lineSegment1Start.X <= lineSegment2End.X)
- {
- return new IntersectionResult(true, lineSegment1Start);
- }
- if (lineSegment2Start.X >= lineSegment1Start.X && lineSegment2Start.X <= lineSegment1End.X)
- {
- return new IntersectionResult(true, lineSegment2Start);
- }
- return new IntersectionResult();
- }
- // parallel
- return new IntersectionResult();
- }
-
- var r = numerator / denominator;
- if (r < 0 || r > 1)
- {
- return new IntersectionResult();
- }
-
- var s = (deltaACy * deltaBAx - deltaACx * deltaBAy) / denominator;
- if (s < 0 || s > 1)
- {
- return new IntersectionResult();
- }
-
- return new IntersectionResult(
- true,
- new Vector2((float)(lineSegment1Start.X + r * deltaBAx), (float)(lineSegment1Start.Y + r * deltaBAy)));
- }
-
- //Vector2 class extended methods:
-
- ///
- /// Returns true if the vector is valid.
- ///
- /// The vector.
- ///
- public static bool IsValid(this Vector2 v)
- {
- return v != Vector2.Zero;
- }
-
- ///
- /// Determines whether this instance is valid.
- ///
- /// The vector.
- ///
- public static bool IsValid(this Vector3 v)
- {
- return v != Vector3.Zero;
- }
-
- ///
- /// Joins all the polygones in the list in one polygone if they interect.
- ///
- /// The polygon list.
- ///
- public static List JoinPolygons(this List sList)
- {
- var p = ClipPolygons(sList);
- var tList = new List>();
-
- var c = new Clipper();
- c.AddPaths(p, PolyType.ptClip, true);
- c.Execute(ClipType.ctUnion, tList, PolyFillType.pftNonZero, PolyFillType.pftNonZero);
-
- return ToPolygons(tList);
- }
-
- ///
- /// Joins all the polygones.
- /// ClipType: http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Types/ClipType.htm
- /// PolyFillType: http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm
- ///
- /// The s list.
- /// Type of the c.
- /// Type of the p.
- /// The p f type1.
- /// The p f type2.
- ///
- public static List JoinPolygons(
- this List sList,
- ClipType cType,
- PolyType pType = PolyType.ptClip,
- PolyFillType pFType1 = PolyFillType.pftNonZero,
- PolyFillType pFType2 = PolyFillType.pftNonZero)
- {
- var p = ClipPolygons(sList);
- var tList = new List>();
-
- var c = new Clipper();
- c.AddPaths(p, pType, true);
- c.Execute(cType, tList, pFType1, pFType2);
-
- return ToPolygons(tList);
- }
-
- ///
- /// Moves the polygone to the set position. It dosent rotate the polygone.
- ///
- /// The polygon.
- /// The move to.
- ///
- public static Polygon MovePolygone(this Polygon polygon, Vector2 moveTo)
- {
- var p = new Polygon();
-
- p.Add(moveTo);
-
- var count = polygon.Points.Count;
-
- var startPoint = polygon.Points[0];
-
- for (var i = 1; i < count; i++)
- {
- var polygonePoint = polygon.Points[i];
-
- p.Add(
- new Vector2(
- moveTo.X + (polygonePoint.X - startPoint.X),
- moveTo.Y + (polygonePoint.Y - startPoint.Y)));
- }
- return p;
- }
-
- ///
- /// Returns the vector normalized.
- ///
- /// The vector.
- ///
- public static Vector2 Normalized(this Vector2 v)
- {
- v.Normalize();
- return v;
- }
-
- ///
- /// Normalizes the specified vector.
- ///
- /// The vector.
- ///
- public static Vector3 Normalized(this Vector3 v)
- {
- v.Normalize();
- return v;
- }
-
- ///
- /// Returns the total distance of a path.
- ///
- /// The path.
- ///
- public static float PathLength(this List path)
- {
- var distance = 0f;
- for (var i = 0; i < path.Count - 1; i++)
- {
- distance += path[i].Distance(path[i + 1]);
- }
- return distance;
- }
-
- ///
- /// Returns the perpendicular vector.
- ///
- /// The v.
- ///
- public static Vector2 Perpendicular(this Vector2 v)
- {
- return new Vector2(-v.Y, v.X);
- }
-
- ///
- /// Returns the second perpendicular vector.
- ///
- /// The vector.
- ///
- public static Vector2 Perpendicular2(this Vector2 v)
- {
- return new Vector2(v.Y, -v.X);
- }
-
- ///
- /// Returns the polar for vector angle (in Degrees).
- ///
- /// The vector.
- ///
- public static float Polar(this Vector2 v1)
- {
- if (Close(v1.X, 0, 0))
- {
- if (v1.Y > 0)
- {
- return 90;
- }
- return v1.Y < 0 ? 270 : 0;
- }
-
- var theta = RadianToDegree(Math.Atan((v1.Y) / v1.X));
- if (v1.X < 0)
- {
- theta = theta + 180;
- }
- if (theta < 0)
- {
- theta = theta + 360;
- }
- return theta;
- }
-
- ///
- /// Returns the position where the vector will be after t(time) with s(speed) and delay.
- ///
- /// The self.
- /// The time.
- /// The speed.
- /// The delay.
- ///
- public static Vector2 PositionAfter(this List self, int t, int s, int delay = 0)
- {
- var distance = Math.Max(0, t - delay) * s / 1000;
- for (var i = 0; i <= self.Count - 2; i++)
- {
- var from = self[i];
- var to = self[i + 1];
- var d = (int)to.Distance(from);
- if (d > distance)
- {
- return from + distance * (to - from).Normalized();
- }
- distance -= d;
- }
- return self[self.Count - 1];
- }
-
- ///
- /// Returns the projection of the Vector2 on the segment.
- ///
- /// The point.
- /// The segment start.
- /// The segment end.
- ///
- public static ProjectionInfo ProjectOn(this Vector2 point, Vector2 segmentStart, Vector2 segmentEnd)
- {
- var cx = point.X;
- var cy = point.Y;
- var ax = segmentStart.X;
- var ay = segmentStart.Y;
- var bx = segmentEnd.X;
- var by = segmentEnd.Y;
- var rL = ((cx - ax) * (bx - ax) + (cy - ay) * (by - ay))
- / ((float)Math.Pow(bx - ax, 2) + (float)Math.Pow(by - ay, 2));
- var pointLine = new Vector2(ax + rL * (bx - ax), ay + rL * (by - ay));
- float rS;
- if (rL < 0)
- {
- rS = 0;
- }
- else if (rL > 1)
- {
- rS = 1;
- }
- else
- {
- rS = rL;
- }
-
- var isOnSegment = rS.CompareTo(rL) == 0;
- var pointSegment = isOnSegment ? pointLine : new Vector2(ax + rS * (bx - ax), ay + rS * (@by - ay));
- return new ProjectionInfo(isOnSegment, pointSegment, pointLine);
- }
-
- ///
- /// Converts radians to degrees.
- ///
- /// The angle.
- ///
- public static float RadianToDegree(double angle)
- {
- return (float)(angle * (180.0 / Math.PI));
- }
-
- ///
- /// Rotates the vector around the set position.
- /// Angle is in radians.
- ///
- /// The rotated.
- /// The around.
- /// The angle.
- ///
- public static Vector2 RotateAroundPoint(this Vector2 rotated, Vector2 around, float angle)
- {
- var sin = Math.Sin(angle);
- var cos = Math.Cos(angle);
-
- var x = cos * (rotated.X - around.X) - sin * (rotated.Y - around.Y) + around.X;
- var y = sin * (rotated.X - around.X) + cos * (rotated.Y - around.Y) + around.Y;
-
- return new Vector2((float)x, (float)y);
- }
-
- ///
- /// Rotates the vector a set angle (angle in radians).
- ///
- /// The vector.
- /// The angle.
- ///
- public static Vector2 Rotated(this Vector2 v, float angle)
- {
- var c = Math.Cos(angle);
- var s = Math.Sin(angle);
-
- return new Vector2((float)(v.X * c - v.Y * s), (float)(v.Y * c + v.X * s));
- }
-
- ///
- /// Rotates the polygon around the set position.
- /// Angle is in radians.
- ///
- /// The polygon.
- /// The around.
- /// The angle.
- ///
- public static Polygon RotatePolygon(this Polygon polygon, Vector2 around, float angle)
- {
- var p = new Polygon();
-
- foreach (var polygonePoint in polygon.Points.Select(poinit => RotateAroundPoint(poinit, around, angle)))
- {
- p.Add(polygonePoint);
- }
- return p;
- }
-
- ///
- /// Rotates the polygon around to the set direction.
- ///
- /// The polygon.
- /// The around.
- /// The direction.
- ///
- public static Polygon RotatePolygon(this Polygon polygon, Vector2 around, Vector2 direction)
- {
- var deltaX = around.X - direction.X;
- var deltaY = around.Y - direction.Y;
- var angle = (float)Math.Atan2(deltaY, deltaX);
- return RotatePolygon(polygon, around, angle - DegreeToRadian(90));
- }
-
- ///
- /// Sets the z.
- ///
- /// The v.
- /// The value.
- ///
- public static Vector3 SetZ(this Vector3 v, float? value = null)
- {
- if (value == null)
- {
- v.Z = Game.CursorPos.Z;
- }
- else
- {
- v.Z = (float)value;
- }
- return v;
- }
-
- ///
- /// Shortens the specified vector.
- ///
- /// The vector.
- /// The vector to shorten from.
- /// The distance.
- ///
- public static Vector2 Shorten(this Vector2 v, Vector2 to, float distance)
- {
- return v - distance * (to - v).Normalized();
- }
-
- ///
- /// Shortens the specified vector.
- ///
- /// The vector.
- /// The vector to shorten from.
- /// The distance.
- ///
- public static Vector3 Shorten(this Vector3 v, Vector3 to, float distance)
- {
- return v - distance * (to - v).Normalized();
- }
-
- ///
- /// Switches the Y and Z.
- ///
- /// The vector.
- ///
- public static Vector3 SwitchYZ(this Vector3 v)
- {
- return new Vector3(v.X, v.Z, v.Y);
- }
-
- //Vector3 class extended methods:
-
- ///
- /// Converts a Vector3 to Vector2
- ///
- /// The v.
- ///
- public static Vector2 To2D(this Vector3 v)
- {
- return new Vector2(v.X, v.Y);
- }
-
- ///
- /// Converts a 3D path to 2D
- ///
- /// The path.
- ///
- public static List To2D(this List path)
- {
- return path.Select(point => point.To2D()).ToList();
- }
-
- ///
- /// Converts the Vector2 to Vector3. (Z = Player.ServerPosition.Z)
- ///
- /// The vector.
- ///
- public static Vector3 To3D(this Vector2 v)
- {
- return new Vector3(v.X, v.Y, ObjectManager.Player.ServerPosition.Z);
- }
-
- ///
- /// Converts the Vector2 to Vector3. (Z = NavMesh.GetHeightForPosition)
- ///
- /// The vector.
- ///
- public static Vector3 To3D2(this Vector2 v)
- {
- return new Vector3(v.X, v.Y, NavMesh.GetHeightForPosition(v.X, v.Y));
- }
-
- ///
- /// Converts a list of to a polygon.
- ///
- /// The int points.
- ///
- public static Polygon ToPolygon(this List v)
- {
- var polygon = new Polygon();
- foreach (var point in v)
- {
- polygon.Add(new Vector2(point.X, point.Y));
- }
- return polygon;
- }
-
- ///
- /// Converts a list of list points to a polygon.
- ///
- /// The v.
- ///
- public static List ToPolygons(this List> v)
- {
- return v.Select(path => path.ToPolygon()).ToList();
- }
-
- ///
- /// Gets the vectors movement collision.
- ///
- /// The start point1.
- /// The end point1.
- /// The v1.
- /// The start point2.
- /// The v2.
- /// The delay.
- ///
- public static Object[] VectorMovementCollision(
- Vector2 startPoint1,
- Vector2 endPoint1,
- float v1,
- Vector2 startPoint2,
- float v2,
- float delay = 0f)
- {
- float sP1x = startPoint1.X,
- sP1y = startPoint1.Y,
- eP1x = endPoint1.X,
- eP1y = endPoint1.Y,
- sP2x = startPoint2.X,
- sP2y = startPoint2.Y;
-
- float d = eP1x - sP1x, e = eP1y - sP1y;
- float dist = (float)Math.Sqrt(d * d + e * e), t1 = float.NaN;
- float S = Math.Abs(dist) > float.Epsilon ? v1 * d / dist : 0,
- K = (Math.Abs(dist) > float.Epsilon) ? v1 * e / dist : 0f;
-
- float r = sP2x - sP1x, j = sP2y - sP1y;
- var c = r * r + j * j;
-
- if (dist > 0f)
- {
- if (Math.Abs(v1 - float.MaxValue) < float.Epsilon)
- {
- var t = dist / v1;
- t1 = v2 * t >= 0f ? t : float.NaN;
- }
- else if (Math.Abs(v2 - float.MaxValue) < float.Epsilon)
- {
- t1 = 0f;
- }
- else
- {
- float a = S * S + K * K - v2 * v2, b = -r * S - j * K;
-
- if (Math.Abs(a) < float.Epsilon)
- {
- if (Math.Abs(b) < float.Epsilon)
- {
- t1 = (Math.Abs(c) < float.Epsilon) ? 0f : float.NaN;
- }
- else
- {
- var t = -c / (2 * b);
- t1 = (v2 * t >= 0f) ? t : float.NaN;
- }
- }
- else
- {
- var sqr = b * b - a * c;
- if (sqr >= 0)
- {
- var nom = (float)Math.Sqrt(sqr);
- var t = (-nom - b) / a;
- t1 = v2 * t >= 0f ? t : float.NaN;
- t = (nom - b) / a;
- var t2 = (v2 * t >= 0f) ? t : float.NaN;
-
- if (!float.IsNaN(t2) && !float.IsNaN(t1))
- {
- if (t1 >= delay && t2 >= delay)
- {
- t1 = Math.Min(t1, t2);
- }
- else if (t2 >= delay)
- {
- t1 = t2;
- }
- }
- }
- }
- }
- }
- else if (Math.Abs(dist) < float.Epsilon)
- {
- t1 = 0f;
- }
-
- return new Object[] { t1, (!float.IsNaN(t1)) ? new Vector2(sP1x + S * t1, sP1y + K * t1) : new Vector2() };
- }
-
- #endregion
-
- ///
- /// Represents an intersection result.
- ///
- public struct IntersectionResult
- {
- #region Fields
-
- ///
- /// If they intersect.
- ///
- public bool Intersects;
-
- ///
- /// The point
- ///
- public Vector2 Point;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the struct.
- ///
- /// if set to true, they insersect.
- /// The point.
- public IntersectionResult(bool Intersects = false, Vector2 Point = new Vector2())
- {
- this.Intersects = Intersects;
- this.Point = Point;
- }
-
- #endregion
- }
-
- ///
- /// Represents the projection information.
- ///
- public struct ProjectionInfo
- {
- #region Fields
-
- ///
- /// The is on segment
- ///
- public bool IsOnSegment;
-
- ///
- /// The line point
- ///
- public Vector2 LinePoint;
-
- ///
- /// The segment point
- ///
- public Vector2 SegmentPoint;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the struct.
- ///
- /// if set to true [is on segment].
- /// The segment point.
- /// The line point.
- public ProjectionInfo(bool isOnSegment, Vector2 segmentPoint, Vector2 linePoint)
- {
- this.IsOnSegment = isOnSegment;
- this.SegmentPoint = segmentPoint;
- this.LinePoint = linePoint;
- }
-
- #endregion
- }
-
- ///
- /// Represents a polygon.
- ///
- public class Polygon
- {
- #region Fields
-
- ///
- /// The points
- ///
- public List Points = new List();
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Adds the specified point.
- ///
- /// The point.
- public void Add(Vector2 point)
- {
- this.Points.Add(point);
- }
-
- ///
- /// Adds the specified point.
- ///
- /// The point.
- public void Add(Vector3 point)
- {
- this.Points.Add(point.To2D());
- }
-
- ///
- /// Adds the specified polygon.
- ///
- /// The polygon.
- public void Add(Polygon polygon)
- {
- foreach (var point in polygon.Points)
- {
- this.Points.Add(point);
- }
- }
-
- ///
- /// Draws the polygon.
- ///
- /// The color.
- /// The width.
- public virtual void Draw(Color color, int width = 1)
- {
- for (var i = 0; i <= this.Points.Count - 1; i++)
- {
- var nextIndex = (this.Points.Count - 1 == i) ? 0 : (i + 1);
- var from = Drawing.WorldToScreen(this.Points[i].To3D());
- var to = Drawing.WorldToScreen(this.Points[nextIndex].To3D());
- Drawing.DrawLine(from[0], from[1], to[0], to[1], width, color);
- }
- }
-
- ///
- /// Determines whether the specified point is inside.
- ///
- /// The point.
- ///
- public bool IsInside(Vector2 point)
- {
- return !this.IsOutside(point);
- }
-
- ///
- /// Determines whether the specified point is inside.
- ///
- /// The point.
- ///
- public bool IsInside(Vector3 point)
- {
- return !this.IsOutside(point.To2D());
- }
-
- ///
- /// Determines whether the specified point is inside.
- ///
- /// The point.
- ///
- public bool IsInside(GameObject point)
- {
- return !this.IsOutside(point.Position.To2D());
- }
-
- ///
- /// Determines whether the specified point is outside.
- ///
- /// The point.
- ///
- public bool IsOutside(Vector2 point)
- {
- var p = new IntPoint(point.X, point.Y);
- return Clipper.PointInPolygon(p, this.ToClipperPath()) != 1;
- }
-
- ///
- /// Converts this instance to a clipper path.
- ///
- ///
- public List ToClipperPath()
- {
- var result = new List(this.Points.Count);
- result.AddRange(this.Points.Select(point => new IntPoint(point.X, point.Y)));
- return result;
- }
-
- #endregion
-
- ///
- /// Represnets an arc polygon.
- ///
- public class Arc : Polygon
- {
- #region Fields
-
- ///
- /// The angle
- ///
- public float Angle;
-
- ///
- /// The end position
- ///
- public Vector2 EndPos;
-
- ///
- /// The radius
- ///
- public float Radius;
-
- ///
- /// The start position
- ///
- public Vector2 StartPos;
-
- ///
- /// The quality
- ///
- private readonly int _quality;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The start.
- /// The direction.
- /// The angle.
- /// The radius.
- /// The quality.
- public Arc(Vector3 start, Vector3 direction, float angle, float radius, int quality = 20)
- : this(start.To2D(), direction.To2D(), angle, radius, quality)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The start.
- /// The direction.
- /// The angle.
- /// The radius.
- /// The quality.
- public Arc(Vector2 start, Vector2 direction, float angle, float radius, int quality = 20)
- {
- this.StartPos = start;
- this.EndPos = (direction - start).Normalized();
- this.Angle = angle;
- this.Radius = radius;
- this._quality = quality;
- this.UpdatePolygon();
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Updates the polygon.
- ///
- /// The offset.
- public void UpdatePolygon(int offset = 0)
- {
- this.Points.Clear();
- var outRadius = (this.Radius + offset) / (float)Math.Cos(2 * Math.PI / this._quality);
- var side1 = this.EndPos.Rotated(-this.Angle * 0.5f);
- for (var i = 0; i <= this._quality; i++)
- {
- var cDirection = side1.Rotated(i * this.Angle / this._quality).Normalized();
- this.Points.Add(
- new Vector2(
- this.StartPos.X + outRadius * cDirection.X,
- this.StartPos.Y + outRadius * cDirection.Y));
- }
- }
-
- #endregion
- }
-
- ///
- /// Represents a circle polygon.
- ///
- public class Circle : Polygon
- {
- #region Fields
-
- ///
- /// The center
- ///
- public Vector2 Center;
-
- ///
- /// The radius
- ///
- public float Radius;
-
- ///
- /// The quality
- ///
- private readonly int _quality;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The center.
- /// The radius.
- /// The quality.
- public Circle(Vector3 center, float radius, int quality = 20)
- : this(center.To2D(), radius, quality)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The center.
- /// The radius.
- /// The quality.
- public Circle(Vector2 center, float radius, int quality = 20)
- {
- this.Center = center;
- this.Radius = radius;
- this._quality = quality;
- this.UpdatePolygon();
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Updates the polygon.
- ///
- /// The offset.
- /// Width of the override.
- public void UpdatePolygon(int offset = 0, float overrideWidth = -1)
- {
- this.Points.Clear();
- var outRadius = (overrideWidth > 0
- ? overrideWidth
- : (offset + this.Radius) / (float)Math.Cos(2 * Math.PI / this._quality));
- for (var i = 1; i <= this._quality; i++)
- {
- var angle = i * 2 * Math.PI / this._quality;
- var point = new Vector2(
- this.Center.X + outRadius * (float)Math.Cos(angle),
- this.Center.Y + outRadius * (float)Math.Sin(angle));
- this.Points.Add(point);
- }
- }
-
- #endregion
- }
-
- ///
- /// Represents a line polygon.
- ///
- public class Line : Polygon
- {
- #region Fields
-
- ///
- /// The line end
- ///
- public Vector2 LineEnd;
-
- ///
- /// The line start
- ///
- public Vector2 LineStart;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The start.
- /// The end.
- /// The length.
- public Line(Vector3 start, Vector3 end, float length = -1)
- : this(start.To2D(), end.To2D(), length)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The start.
- /// The end.
- /// The length.
- public Line(Vector2 start, Vector2 end, float length = -1)
- {
- this.LineStart = start;
- this.LineEnd = end;
- if (length > 0)
- {
- this.Length = length;
- }
- this.UpdatePolygon();
- }
-
- #endregion
-
- #region Public Properties
-
- ///
- /// Gets or sets the length.
- ///
- ///
- /// The length.
- ///
- public float Length
- {
- get
- {
- return this.LineStart.Distance(this.LineEnd);
- }
- set
- {
- this.LineEnd = (this.LineEnd - this.LineStart).Normalized() * value + this.LineStart;
- }
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Updates the polygon.
- ///
- public void UpdatePolygon()
- {
- this.Points.Clear();
- this.Points.Add(this.LineStart);
- this.Points.Add(this.LineEnd);
- }
-
- #endregion
- }
-
- ///
- /// Represents a rectangle polygon.
- ///
- public class Rectangle : Polygon
- {
- #region Fields
-
- ///
- /// The end
- ///
- public Vector2 End;
-
- ///
- /// The start
- ///
- public Vector2 Start;
-
- ///
- /// The width
- ///
- public float Width;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The start.
- /// The end.
- /// The width.
- public Rectangle(Vector3 start, Vector3 end, float width)
- : this(start.To2D(), end.To2D(), width)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The start.
- /// The end.
- /// The width.
- public Rectangle(Vector2 start, Vector2 end, float width)
- {
- this.Start = start;
- this.End = end;
- this.Width = width;
- this.UpdatePolygon();
- }
-
- #endregion
-
- #region Public Properties
-
- ///
- /// Gets the direction.
- ///
- ///
- /// The direction.
- ///
- public Vector2 Direction
- {
- get
- {
- return (this.End - this.Start).Normalized();
- }
- }
-
- ///
- /// Gets the perpendicular.
- ///
- ///
- /// The perpendicular.
- ///
- public Vector2 Perpendicular
- {
- get
- {
- return this.Direction.Perpendicular();
- }
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Updates the polygon.
- ///
- /// The offset.
- /// Width of the override.
- public void UpdatePolygon(int offset = 0, float overrideWidth = -1)
- {
- this.Points.Clear();
- this.Points.Add(
- this.Start + (overrideWidth > 0 ? overrideWidth : this.Width + offset) * this.Perpendicular
- - offset * this.Direction);
- this.Points.Add(
- this.Start - (overrideWidth > 0 ? overrideWidth : this.Width + offset) * this.Perpendicular
- - offset * this.Direction);
- this.Points.Add(
- this.End - (overrideWidth > 0 ? overrideWidth : this.Width + offset) * this.Perpendicular
- + offset * this.Direction);
- this.Points.Add(
- this.End + (overrideWidth > 0 ? overrideWidth : this.Width + offset) * this.Perpendicular
- + offset * this.Direction);
- }
-
- #endregion
- }
-
- ///
- /// Represents a ring polygon.
- ///
- public class Ring : Polygon
- {
- #region Fields
-
- ///
- /// The center
- ///
- public Vector2 Center;
-
- ///
- /// The inner radius
- ///
- public float InnerRadius;
-
- ///
- /// The outer radius
- ///
- public float OuterRadius;
-
- ///
- /// The quality
- ///
- private readonly int _quality;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The center.
- /// The inner radius.
- /// The outer radius.
- /// The quality.
- public Ring(Vector3 center, float innerRadius, float outerRadius, int quality = 20)
- : this(center.To2D(), innerRadius, outerRadius, quality)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The center.
- /// The inner radius.
- /// The outer radius.
- /// The quality.
- public Ring(Vector2 center, float innerRadius, float outerRadius, int quality = 20)
- {
- this.Center = center;
- this.InnerRadius = innerRadius;
- this.OuterRadius = outerRadius;
- this._quality = quality;
- this.UpdatePolygon();
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Updates the polygon.
- ///
- /// The offset.
- public void UpdatePolygon(int offset = 0)
- {
- this.Points.Clear();
- var outRadius = (offset + this.InnerRadius + this.OuterRadius)
- / (float)Math.Cos(2 * Math.PI / this._quality);
- var innerRadius = this.InnerRadius - this.OuterRadius - offset;
- for (var i = 0; i <= this._quality; i++)
- {
- var angle = i * 2 * Math.PI / this._quality;
- var point = new Vector2(
- this.Center.X - outRadius * (float)Math.Cos(angle),
- this.Center.Y - outRadius * (float)Math.Sin(angle));
- this.Points.Add(point);
- }
- for (var i = 0; i <= this._quality; i++)
- {
- var angle = i * 2 * Math.PI / this._quality;
- var point = new Vector2(
- this.Center.X + innerRadius * (float)Math.Cos(angle),
- this.Center.Y - innerRadius * (float)Math.Sin(angle));
- this.Points.Add(point);
- }
- }
-
- #endregion
- }
-
- ///
- /// Represnets a sector polygon.
- ///
- public class Sector : Polygon
- {
- #region Fields
-
- ///
- /// The angle
- ///
- public float Angle;
-
- ///
- /// The center
- ///
- public Vector2 Center;
-
- ///
- /// The direction
- ///
- public Vector2 Direction;
-
- ///
- /// The radius
- ///
- public float Radius;
-
- ///
- /// The quality
- ///
- private readonly int _quality;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The center.
- /// The direction.
- /// The angle.
- /// The radius.
- /// The quality.
- public Sector(Vector3 center, Vector3 direction, float angle, float radius, int quality = 20)
- : this(center.To2D(), direction.To2D(), angle, radius, quality)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The center.
- /// The direction.
- /// The angle.
- /// The radius.
- /// The quality.
- public Sector(Vector2 center, Vector2 direction, float angle, float radius, int quality = 20)
- {
- this.Center = center;
- this.Direction = (direction - center).Normalized();
- this.Angle = angle;
- this.Radius = radius;
- this._quality = quality;
- this.UpdatePolygon();
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Rotates Line by angle/radian
- ///
- ///
- ///
- ///
- /// True for radian values, false for degree
- ///
- public Vector2 RotateLineFromPoint(Vector2 point1, Vector2 point2, float value, bool radian = true)
- {
- var angle = !radian ? value * Math.PI / 180 : value;
- var line = Vector2.Subtract(point2, point1);
-
- var newline = new Vector2
- {
- X = (float)(line.X * Math.Cos(angle) - line.Y * Math.Sin(angle)),
- Y = (float)(line.X * Math.Sin(angle) + line.Y * Math.Cos(angle))
- };
-
- return Vector2.Add(newline, point1);
- }
-
- ///
- /// Updates the polygon.
- ///
- /// The offset.
- public void UpdatePolygon(int offset = 0)
- {
- this.Points.Clear();
- var outRadius = (this.Radius + offset) / (float)Math.Cos(2 * Math.PI / this._quality);
- this.Points.Add(this.Center);
- var side1 = this.Direction.Rotated(-this.Angle * 0.5f);
- for (var i = 0; i <= this._quality; i++)
- {
- var cDirection = side1.Rotated(i * this.Angle / this._quality).Normalized();
- this.Points.Add(
- new Vector2(
- this.Center.X + outRadius * cDirection.X,
- this.Center.Y + outRadius * cDirection.Y));
- }
- }
-
- #endregion
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Hacks.cs b/Hacks.cs
deleted file mode 100644
index 00ac65c1..00000000
--- a/Hacks.cs
+++ /dev/null
@@ -1,165 +0,0 @@
-namespace LeagueSharp.Common
-{
- ///
- /// Adds hacks to the menu.
- ///
- internal class Hacks
- {
- #region Constants
-
- private const int WM_KEYDOWN = 0x100;
-
- private const int WM_KEYUP = 0x101;
-
- #endregion
-
- #region Static Fields
-
- private static Menu menu;
-
- private static MenuItem MenuAntiAfk;
-
- private static MenuItem MenuDisableDrawings;
-
- private static MenuItem MenuDisableSay;
-
- private static MenuItem MenuTowerRange;
-
- public static bool AntiAFK
- {
- get
- {
- return LeagueSharp.Hacks.AntiAFK;
- }
- set
- {
- if (value == LeagueSharp.Hacks.AntiAFK)
- {
- return;
- }
-
- LeagueSharp.Hacks.AntiAFK = value;
- }
- }
-
- public static bool DisableDrawings
- {
- get
- {
- return LeagueSharp.Hacks.DisableDrawings;
- }
- set
- {
- if (value == LeagueSharp.Hacks.DisableDrawings)
- {
- return;
- }
-
- LeagueSharp.Hacks.DisableDrawings = value;
- }
- }
-
- public static bool DisableSay
- {
- get
- {
- return LeagueSharp.Hacks.DisableSay;
- }
- set
- {
- if (value == LeagueSharp.Hacks.DisableSay)
- {
- return;
- }
-
- LeagueSharp.Hacks.DisableSay = value;
- }
- }
-
- public static bool TowerRanges
- {
- get
- {
- return LeagueSharp.Hacks.TowerRanges;
- }
- set
- {
- if (value == LeagueSharp.Hacks.TowerRanges)
- {
- return;
- }
-
- LeagueSharp.Hacks.TowerRanges = value;
- }
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- public static void Shutdown()
- {
- Menu.Remove(menu);
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Initializes this instance.
- ///
- internal static void Initialize()
- {
- CustomEvents.Game.OnGameLoad += eventArgs =>
- {
- menu = new Menu("Hacks", "Hacks");
-
- MenuAntiAfk = menu.AddItem(new MenuItem("AfkHack", "Anti-AFK").SetValue(false));
- MenuAntiAfk.ValueChanged += (sender, args) => AntiAFK = args.GetNewValue();
-
- MenuDisableDrawings = menu.AddItem(new MenuItem("DrawingHack", "Disable Drawing").SetValue(false));
- MenuDisableDrawings.ValueChanged += (sender, args) => DisableDrawings = args.GetNewValue();
- MenuDisableDrawings.SetValue(DisableDrawings);
-
- MenuDisableSay = menu.AddItem(new MenuItem("SayHack", "Disable L# Send Chat").SetValue(false).SetTooltip("Block Game.Say from Assemblies"));
- MenuDisableSay.ValueChanged += (sender, args) => DisableSay = args.GetNewValue();
-
- MenuTowerRange = menu.AddItem(new MenuItem("TowerHack", "Show Tower Ranges").SetValue(false));
- MenuTowerRange.ValueChanged += (sender, args) => TowerRanges = args.GetNewValue();
-
- AntiAFK = MenuAntiAfk.GetValue();
- DisableDrawings = MenuDisableDrawings.GetValue();
- DisableSay = MenuDisableSay.GetValue();
- TowerRanges = MenuTowerRange.GetValue();
-
- CommonMenu.Instance.AddSubMenu(menu);
-
- Game.OnWndProc += args =>
- {
- if (!MenuDisableDrawings.GetValue())
- {
- return;
- }
-
- if ((int)args.WParam != Config.ShowMenuPressKey)
- {
- return;
- }
-
- if (args.Msg == WM_KEYDOWN)
- {
- LeagueSharp.Hacks.DisableDrawings = false;
- }
-
- if (args.Msg == WM_KEYUP)
- {
- LeagueSharp.Hacks.DisableDrawings = true;
- }
- };
- };
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/HeroManager.cs b/HeroManager.cs
deleted file mode 100644
index de7e22d5..00000000
--- a/HeroManager.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Collections.Generic;
- using System.Linq;
-
- ///
- /// Provides cached heroes.
- ///
- public class HeroManager
- {
- #region Constructors and Destructors
-
- ///
- /// Initializes static members of the class.
- ///
- static HeroManager()
- {
- if (Game.Mode == GameMode.Running)
- {
- Game_OnStart(new EventArgs());
- }
- Game.OnStart += Game_OnStart;
- }
-
- #endregion
-
- #region Public Properties
-
- ///
- /// Gets all heroes.
- ///
- ///
- /// All heroes.
- ///
- public static List AllHeroes { get; private set; }
-
- ///
- /// Gets the allies.
- ///
- ///
- /// The allies.
- ///
- public static List Allies { get; private set; }
-
- ///
- /// Gets the enemies.
- ///
- ///
- /// The enemies.
- ///
- public static List Enemies { get; private set; }
-
- ///
- /// Gets the Local Player
- ///
- public static Obj_AI_Hero Player { get; private set; }
-
- #endregion
-
- #region Methods
-
- ///
- /// Fired when the game starts.
- ///
- /// The instance containing the event data.
- static void Game_OnStart(EventArgs args)
- {
- AllHeroes = ObjectManager.Get().ToList();
- Allies = AllHeroes.FindAll(o => o.IsAlly);
- Enemies = AllHeroes.FindAll(o => o.IsEnemy);
- Player = AllHeroes.Find(x => x.IsMe);
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/LeagueSharp.Common.csproj b/LeagueSharp.Common.csproj
deleted file mode 100644
index 0e845451..00000000
--- a/LeagueSharp.Common.csproj
+++ /dev/null
@@ -1,212 +0,0 @@
-
-
-
-
- Release
- AnyCPU
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}
- Library
- Properties
- LeagueSharp.Common
- LeagueSharp.Common
- v4.5
- 512
-
- x86
- bin\Release
-
-
-
- true
- full
- false
- bin\Release
- DEBUG;TRACE
- prompt
- 4
- x86
-
-
- pdbonly
- true
- bin\Release
- TRACE
- prompt
- 4
-
-
- true
- bin\x86\Debug\
- DEBUG;TRACE
- full
- x86
- prompt
- MinimumRecommendedRules.ruleset
-
-
- bin\x86\Release\
- TRACE
- true
- pdbonly
- x86
- prompt
- MinimumRecommendedRules.ruleset
-
-
- true
- bin\x64\Debug\
- DEBUG;TRACE
- full
- x64
- prompt
- MinimumRecommendedRules.ruleset
-
-
- bin\x64\Release\
- TRACE
- true
- pdbonly
- x64
- prompt
- MinimumRecommendedRules.ruleset
-
-
- true
-
-
- Key.snk
-
-
-
- ..\..\..\..\..\Program Files (x86)\O46HgaACH\References\clipper_library.dll
-
-
- ..\..\..\..\..\Program Files (x86)\O46HgaACH\References\LeagueSharp.dll
-
-
- ..\..\..\..\..\Program Files (x86)\O46HgaACH\References\LeagueSharp.Data.dll
-
-
- ..\..\..\..\..\Program Files (x86)\O46HgaACH\System\LeagueSharp.Sandbox.dll
-
-
- ..\..\..\..\..\Program Files (x86)\O46HgaACH\References\SharpDX.dll
-
-
- ..\..\..\..\..\Program Files (x86)\O46HgaACH\References\SharpDX.Direct3D9.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Component
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- True
- True
- Resources.resx
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ResXFileCodeGenerator
- Resources.Designer.cs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/LeagueSharp.Common.csproj.DotSettings b/LeagueSharp.Common.csproj.DotSettings
deleted file mode 100644
index c5674628..00000000
--- a/LeagueSharp.Common.csproj.DotSettings
+++ /dev/null
@@ -1,4 +0,0 @@
-
- True
- True
- True
\ No newline at end of file
diff --git a/LeagueSharp.Common.ruleset b/LeagueSharp.Common.ruleset
new file mode 100644
index 00000000..2544c1f9
--- /dev/null
+++ b/LeagueSharp.Common.ruleset
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LeagueSharp.Common.sln b/LeagueSharp.Common.sln
index 5c646956..9fe3d371 100644
--- a/LeagueSharp.Common.sln
+++ b/LeagueSharp.Common.sln
@@ -1,32 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
+VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LeagueSharp.Common", "LeagueSharp.Common.csproj", "{21D7E4EF-319E-4AD4-A59C-45AF22072DCA}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LeagueSharp.Common", "source\LeagueSharp.Common.csproj", "{BFB66E60-98AB-4178-AB3D-7B9C3EBEC2F7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Debug|x64.ActiveCfg = Debug|x64
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Debug|x64.Build.0 = Debug|x64
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Debug|x86.ActiveCfg = Debug|x86
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Debug|x86.Build.0 = Debug|x86
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Release|Any CPU.Build.0 = Release|Any CPU
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Release|x64.ActiveCfg = Release|x64
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Release|x64.Build.0 = Release|x64
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Release|x86.ActiveCfg = Release|x86
- {21D7E4EF-319E-4AD4-A59C-45AF22072DCA}.Release|x86.Build.0 = Release|x86
+ {BFB66E60-98AB-4178-AB3D-7B9C3EBEC2F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BFB66E60-98AB-4178-AB3D-7B9C3EBEC2F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BFB66E60-98AB-4178-AB3D-7B9C3EBEC2F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BFB66E60-98AB-4178-AB3D-7B9C3EBEC2F7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/LeagueSharp.Common.sln.DotSettings b/LeagueSharp.Common.sln.DotSettings
new file mode 100644
index 00000000..ce292d08
--- /dev/null
+++ b/LeagueSharp.Common.sln.DotSettings
@@ -0,0 +1,2 @@
+
+ IVQ
\ No newline at end of file
diff --git a/Key.snk b/LeagueSharp.Common.snk
similarity index 100%
rename from Key.snk
rename to LeagueSharp.Common.snk
diff --git a/MEC.cs b/MEC.cs
deleted file mode 100644
index 1b7e51f9..00000000
--- a/MEC.cs
+++ /dev/null
@@ -1,455 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Collections.Generic;
- using System.Linq;
-
- using SharpDX;
-
- ///
- /// Provides method to calculate the minimum enclosing circle.
- ///
- public static class MEC
- {
- #region Static Fields
-
- ///
- /// The minimum maximum box
- ///
- public static RectangleF g_MinMaxBox;
-
- // For debugging.
-
- ///
- /// The minimum maximum corners
- ///
- public static Vector2[] g_MinMaxCorners;
-
- ///
- /// The non culled points
- ///
- public static Vector2[] g_NonCulledPoints;
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Finds the minimal bounding circle.
- ///
- /// The points.
- /// The center.
- /// The radius.
- public static void FindMinimalBoundingCircle(List points, out Vector2 center, out float radius)
- {
- // Find the convex hull.
- var hull = MakeConvexHull(points);
-
- // The best solution so far.
- var best_center = points[0];
- var best_radius2 = float.MaxValue;
-
- // Look at pairs of hull points.
- for (var i = 0; i < hull.Count - 1; i++)
- {
- for (var j = i + 1; j < hull.Count; j++)
- {
- // Find the circle through these two points.
- var test_center = new Vector2((hull[i].X + hull[j].X) / 2f, (hull[i].Y + hull[j].Y) / 2f);
- var dx = test_center.X - hull[i].X;
- var dy = test_center.Y - hull[i].Y;
- var test_radius2 = dx * dx + dy * dy;
-
- // See if this circle would be an improvement.
- if (test_radius2 < best_radius2)
- {
- // See if this circle encloses all of the points.
- if (CircleEnclosesPoints(test_center, test_radius2, points, i, j, -1))
- {
- // Save this solution.
- best_center = test_center;
- best_radius2 = test_radius2;
- }
- }
- } // for i
- } // for j
-
- // Look at triples of hull points.
- for (var i = 0; i < hull.Count - 2; i++)
- {
- for (var j = i + 1; j < hull.Count - 1; j++)
- {
- for (var k = j + 1; k < hull.Count; k++)
- {
- // Find the circle through these three points.
- Vector2 test_center;
- float test_radius2;
- FindCircle(hull[i], hull[j], hull[k], out test_center, out test_radius2);
-
- // See if this circle would be an improvement.
- if (test_radius2 < best_radius2)
- {
- // See if this circle encloses all of the points.
- if (CircleEnclosesPoints(test_center, test_radius2, points, i, j, k))
- {
- // Save this solution.
- best_center = test_center;
- best_radius2 = test_radius2;
- }
- }
- } // for k
- } // for i
- } // for j
-
- center = best_center;
- if (best_radius2 == float.MaxValue)
- {
- radius = 0;
- }
- else
- {
- radius = (float)Math.Sqrt(best_radius2);
- }
- }
-
- ///
- /// Returns the mininimum enclosing circle from a list of points.
- ///
- /// The points.
- /// MecCircle.
- public static MecCircle GetMec(List points)
- {
- var center = new Vector2();
- float radius;
-
- var ConvexHull = MakeConvexHull(points);
- FindMinimalBoundingCircle(ConvexHull, out center, out radius);
- return new MecCircle(center, radius);
- }
-
- ///
- /// Makes the convex hull.
- ///
- /// The points.
- /// Points that make up a polygon's convex hull..
- public static List MakeConvexHull(List points)
- {
- // Cull.
- points = HullCull(points);
-
- // Find the remaining point with the smallest Y value.
- // if (there's a tie, take the one with the smaller X value.
- Vector2[] best_pt = { points[0] };
- foreach (
- var pt in points.Where(pt => (pt.Y < best_pt[0].Y) || ((pt.Y == best_pt[0].Y) && (pt.X < best_pt[0].X)))
- )
- {
- best_pt[0] = pt;
- }
-
- // Move this point to the convex hull.
- var hull = new List { best_pt[0] };
- points.Remove(best_pt[0]);
-
- // Start wrapping up the other points.
- float sweep_angle = 0;
- for (;;)
- {
- // If all of the points are on the hull, we're done.
- if (points.Count == 0)
- {
- break;
- }
-
- // Find the point with smallest AngleValue
- // from the last point.
- var X = hull[hull.Count - 1].X;
- var Y = hull[hull.Count - 1].Y;
- best_pt[0] = points[0];
- float best_angle = 3600;
-
- // Search the rest of the points.
- foreach (var pt in points)
- {
- var test_angle = AngleValue(X, Y, pt.X, pt.Y);
- if ((test_angle >= sweep_angle) && (best_angle > test_angle))
- {
- best_angle = test_angle;
- best_pt[0] = pt;
- }
- }
-
- // See if the first point is better.
- // If so, we are done.
- var first_angle = AngleValue(X, Y, hull[0].X, hull[0].Y);
- if ((first_angle >= sweep_angle) && (best_angle >= first_angle))
- {
- // The first point is better. We're done.
- break;
- }
-
- // Add the best point to the convex hull.
- hull.Add(best_pt[0]);
- points.Remove(best_pt[0]);
-
- sweep_angle = best_angle;
- }
-
- return hull;
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Return a number that gives the ordering of angles
- /// WRST horizontal from the point(x1, y1) to(x2, y2).
- /// In other words, AngleValue(x1, y1, x2, y2) is not
- /// the angle, but if:
- /// Angle(x1, y1, x2, y2) > Angle(x1, y1, x2, y2)
- /// then
- /// AngleValue(x1, y1, x2, y2) > AngleValue(x1, y1, x2, y2)
- /// this angle is greater than the angle for another set
- /// of points,) this number for
- /// This function is dy / (dy + dx).
- ///
- /// The x1.
- /// The y1.
- /// The x2.
- /// The y2.
- /// A number that gives the ordering of angles
- private static float AngleValue(float x1, float y1, float x2, float y2)
- {
- float t;
-
- var dx = x2 - x1;
- var ax = Math.Abs(dx);
- var dy = y2 - y1;
- var ay = Math.Abs(dy);
- if (ax + ay == 0)
- {
- // if (the two points are the same, return 360.
- t = 360f / 9f;
- }
- else
- {
- t = dy / (ax + ay);
- }
- if (dx < 0)
- {
- t = 2 - t;
- }
- else if (dy < 0)
- {
- t = 4 + t;
- }
- return t * 90;
- }
-
- ///
- /// Encloses the points in a circle.
- ///
- /// The center.
- /// The radius2.
- /// The points.
- /// The skip1.
- /// The skip2.
- /// The skip3.
- /// true if the indicated circle encloses all of the points, false otherwise.
- private static bool CircleEnclosesPoints(
- Vector2 center,
- float radius2,
- List points,
- int skip1,
- int skip2,
- int skip3)
- {
- return (from point in points.Where((t, i) => (i != skip1) && (i != skip2) && (i != skip3))
- let dx = center.X - point.X
- let dy = center.Y - point.Y
- select dx * dx + dy * dy).All(test_radius2 => !(test_radius2 > radius2));
- }
-
- ///
- /// Finds the circle through the three points.
- ///
- /// a.
- /// The b.
- /// The c.
- /// The center.
- /// The radius2.
- private static void FindCircle(Vector2 a, Vector2 b, Vector2 c, out Vector2 center, out float radius2)
- {
- // Get the perpendicular bisector of (x1, y1) and (x2, y2).
- var x1 = (b.X + a.X) / 2;
- var y1 = (b.Y + a.Y) / 2;
- var dy1 = b.X - a.X;
- var dx1 = -(b.Y - a.Y);
-
- // Get the perpendicular bisector of (x2, y2) and (x3, y3).
- var x2 = (c.X + b.X) / 2;
- var y2 = (c.Y + b.Y) / 2;
- var dy2 = c.X - b.X;
- var dx2 = -(c.Y - b.Y);
-
- // See where the lines intersect.
- var cx = (y1 * dx1 * dx2 + x2 * dx1 * dy2 - x1 * dy1 * dx2 - y2 * dx1 * dx2) / (dx1 * dy2 - dy1 * dx2);
- var cy = (cx - x1) * dy1 / dx1 + y1;
- center = new Vector2(cx, cy);
-
- var dx = cx - a.X;
- var dy = cy - a.Y;
- radius2 = dx * dx + dy * dy;
- }
-
- // Find a box that fits inside the MinMax quadrilateral.
- ///
- /// Gets the minimum maximum box.
- ///
- /// The points.
- /// RectangleF.
- private static RectangleF GetMinMaxBox(List points)
- {
- // Find the MinMax quadrilateral.
- Vector2 ul = new Vector2(0, 0), ur = ul, ll = ul, lr = ul;
- GetMinMaxCorners(points, ref ul, ref ur, ref ll, ref lr);
-
- // Get the coordinates of a box that lies inside this quadrilateral.
- var xmin = ul.X;
- var ymin = ul.Y;
-
- var xmax = ur.X;
- if (ymin < ur.Y)
- {
- ymin = ur.Y;
- }
-
- if (xmax > lr.X)
- {
- xmax = lr.X;
- }
- var ymax = lr.Y;
-
- if (xmin < ll.X)
- {
- xmin = ll.X;
- }
- if (ymax > ll.Y)
- {
- ymax = ll.Y;
- }
-
- var result = new RectangleF(xmin, ymin, xmax - xmin, ymax - ymin);
- g_MinMaxBox = result; // For debugging.
- return result;
- }
-
- // Find the points nearest the upper left, upper right,
- // lower left, and lower right corners.
- ///
- /// Gets the minimum maximum corners.
- ///
- /// The points.
- /// The ul.
- /// The ur.
- /// The ll.
- /// The lr.
- private static void GetMinMaxCorners(
- List points,
- ref Vector2 ul,
- ref Vector2 ur,
- ref Vector2 ll,
- ref Vector2 lr)
- {
- // Start with the first point as the solution.
- ul = points[0];
- ur = ul;
- ll = ul;
- lr = ul;
-
- // Search the other points.
- foreach (var pt in points)
- {
- if (-pt.X - pt.Y > -ul.X - ul.Y)
- {
- ul = pt;
- }
- if (pt.X - pt.Y > ur.X - ur.Y)
- {
- ur = pt;
- }
- if (-pt.X + pt.Y > -ll.X + ll.Y)
- {
- ll = pt;
- }
- if (pt.X + pt.Y > lr.X + lr.Y)
- {
- lr = pt;
- }
- }
-
- g_MinMaxCorners = new[] { ul, ur, lr, ll }; // For debugging.
- }
-
- ///
- /// Culls points out of the convex hull that lie inside the trapezoid defined by the vertices with smallest and largest
- /// X and Y coordinates.
- ///
- /// The points.
- /// Points that are not culled.
- private static List HullCull(List points)
- {
- // Find a culling box.
- var culling_box = GetMinMaxBox(points);
-
- // Cull the points.
- var results =
- points.Where(
- pt =>
- pt.X <= culling_box.Left || pt.X >= culling_box.Right || pt.Y <= culling_box.Top
- || pt.Y >= culling_box.Bottom).ToList();
-
- g_NonCulledPoints = new Vector2[results.Count]; // For debugging.
- results.CopyTo(g_NonCulledPoints); // For debugging.
- return results;
- }
-
- #endregion
-
- ///
- /// Represetns a MecCircle
- ///
- public struct MecCircle
- {
- #region Fields
-
- ///
- /// The center
- ///
- public Vector2 Center;
-
- ///
- /// The radius
- ///
- public float Radius;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the struct.
- ///
- /// The center.
- /// The radius.
- public MecCircle(Vector2 center, float radius)
- {
- this.Center = center;
- this.Radius = radius;
- }
-
- #endregion
- }
- }
-}
\ No newline at end of file
diff --git a/Menu/CPSlider.cs b/Menu/CPSlider.cs
deleted file mode 100644
index c8bacf78..00000000
--- a/Menu/CPSlider.cs
+++ /dev/null
@@ -1,224 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
-
- using LeagueSharp.Common.Properties;
-
- using SharpDX;
-
- ///
- /// The color picker slider.
- ///
- public class CPSlider
- {
- #region Fields
-
- ///
- /// The height.
- ///
- public int Height;
-
- ///
- /// Indicates whether the slider is moving.
- ///
- public bool Moving;
-
- ///
- /// The active sprite.
- ///
- internal Render.Sprite ActiveSprite;
-
- ///
- /// The inactive sprite.
- ///
- internal Render.Sprite InactiveSprite;
-
- ///
- /// The X-axis position.
- ///
- private readonly int xPos;
-
- ///
- /// The Y-axis position.
- ///
- private readonly int yPos;
-
- ///
- /// Indicates whether the slider is visible.
- ///
- private bool isVisible = true;
-
- ///
- /// The percent.
- ///
- private float percent;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the class.
- ///
- ///
- /// The X.
- ///
- ///
- /// The Y.
- ///
- ///
- /// The Height.
- ///
- ///
- /// The Percent.
- ///
- public CPSlider(int x, int y, int height, float percent = 1)
- {
- this.xPos = x;
- this.yPos = y;
- this.Height = height - Resources.CPActiveSlider.Height;
- this.percent = percent;
-
- this.ActiveSprite = new Render.Sprite(Resources.CPActiveSlider, new Vector2(this.X, this.Y));
- this.InactiveSprite = new Render.Sprite(Resources.CPInactiveSlider, new Vector2(this.X, this.Y));
-
- this.ActiveSprite.Add(2);
- this.InactiveSprite.Add(2);
- }
-
- #endregion
-
- #region Public Properties
-
- ///
- /// Gets or sets the percent.
- ///
- public float Percent
- {
- get
- {
- return this.percent;
- }
-
- set
- {
- this.percent = Math.Max(0, Math.Min(1, value));
- }
- }
-
- ///
- /// Gets or sets a value indicating whether the slider is visible.
- ///
- public bool Visible
- {
- get
- {
- return this.isVisible;
- }
-
- set
- {
- this.ActiveSprite.Visible = this.InactiveSprite.Visible = this.isVisible = value;
- }
- }
-
- ///
- /// Gets or sets the width.
- ///
- public int Width
- {
- get
- {
- return Resources.CPActiveSlider.Width;
- }
- }
-
- ///
- /// Gets or sets the X.
- ///
- public int X
- {
- get
- {
- return this.xPos + ColorPicker.X;
- }
-
- set
- {
- this.ActiveSprite.X = this.InactiveSprite.X = value;
- }
- }
-
- ///
- /// Gets or sets the Y.
- ///
- public int Y
- {
- get
- {
- return this.yPos + ColorPicker.Y;
- }
-
- set
- {
- this.ActiveSprite.Y = this.InactiveSprite.Y = value + (int)(this.percent * this.Height);
- }
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// The windows event process message event.
- ///
- ///
- /// The arguments.
- ///
- public void OnWndProc(WndEventComposition args)
- {
- switch (args.Msg)
- {
- case WindowsMessages.WM_LBUTTONDOWN:
- if (Utils.IsUnderRectangle(
- Utils.GetCursorPos(),
- this.X,
- this.Y,
- this.Width,
- this.Height + Resources.CPActiveSlider.Height))
- {
- this.ActiveSprite.Visible = this.Moving = true;
- this.InactiveSprite.Visible = false;
- this.UpdatePercent();
- }
- break;
- case WindowsMessages.WM_MOUSEMOVE:
- if (this.Moving)
- {
- this.UpdatePercent();
- }
- break;
- case WindowsMessages.WM_LBUTTONUP:
- this.ActiveSprite.Visible = this.Moving = false;
- this.InactiveSprite.Visible = true;
- break;
- }
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Updates the percent.
- ///
- private void UpdatePercent()
- {
- this.Percent = (Utils.GetCursorPos().Y - (Resources.CPActiveSlider.Height / 2f) - this.Y) / this.Height;
- ColorPicker.UpdateColor();
- this.ActiveSprite.Y = this.InactiveSprite.Y = this.Y + (int)(this.percent * this.Height);
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/Menu/Circle.cs b/Menu/Circle.cs
deleted file mode 100644
index e095e73f..00000000
--- a/Menu/Circle.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Drawing;
-
- ///
- /// The circle color spectrum (picker), with the toggle feature.
- ///
- [Serializable]
- public struct Circle
- {
- #region Fields
-
- ///
- /// Indicates whether the circle is enabled.
- ///
- public bool Active;
-
- ///
- /// The color.
- ///
- public Color Color;
-
- ///
- /// The radius.
- ///
- public float Radius;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the struct.
- ///
- ///
- /// Indicates whether the circle is active.
- ///
- ///
- /// The color.
- ///
- ///
- /// The radius.
- ///
- public Circle(bool active, Color color, float radius = 100)
- {
- this.Active = active;
- this.Color = color;
- this.Radius = radius;
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/Menu/ColorPicker.cs b/Menu/ColorPicker.cs
deleted file mode 100644
index fca9001b..00000000
--- a/Menu/ColorPicker.cs
+++ /dev/null
@@ -1,485 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System.Drawing;
-
- using LeagueSharp.Common.Properties;
-
- using SharpDX;
-
- using Color = System.Drawing.Color;
-
- ///
- /// The color picker.
- ///
- public static class ColorPicker
- {
- #region Static Fields
-
- ///
- /// The color picker height.
- ///
- public static readonly int ColorPickerH = 221;
-
- ///
- /// The color picker width.
- ///
- public static readonly int ColorPickerW = 234;
-
- ///
- /// The alpha slider.
- ///
- public static CPSlider AlphaSlider;
-
- ///
- /// The background sprite.
- ///
- public static Render.Sprite BackgroundSprite;
-
- ///
- /// The luminity bitmap.
- ///
- public static Bitmap LuminityBitmap;
-
- ///
- /// The luminity sprite.
- ///
- public static Render.Sprite LuminitySprite;
-
- ///
- /// The luminosity slider.
- ///
- public static CPSlider LuminositySlider;
-
- ///
- /// The change color event.
- ///
- public static OnSelectColor OnChangeColor;
-
- ///
- /// The opacity bitmap.
- ///
- public static Bitmap OpacityBitmap;
-
- ///
- /// The opacity sprite.
- ///
- public static Render.Sprite OpacitySprite;
-
- ///
- /// The preview rectangle.
- ///
- public static Render.Rectangle PreviewRectangle;
-
- ///
- /// The last bitmap update(s).
- ///
- private static readonly int[] LastBitmapUpdate = new int[2];
-
- ///
- /// The initial color.
- ///
- private static Color initialColor;
-
- ///
- /// Indicates whether the color picker is moving.
- ///
- private static bool isMoving;
-
- ///
- /// Indicates whether the color is being selected.
- ///
- private static bool isSelecting;
-
- ///
- /// Indicates whether the color picker is visible.
- ///
- private static bool isVisible;
-
- ///
- /// The previous position.
- ///
- private static Vector2 previousPos;
-
- ///
- /// The HSL color.
- ///
- private static HSLColor sColor = new HSLColor(255, 255, 255);
-
- ///
- /// The Hue value.
- ///
- private static double sHue;
-
- ///
- /// The saturation value.
- ///
- private static double sSaturation;
-
- ///
- /// The X-axis position.
- ///
- private static int xPos = 100;
-
- ///
- /// The Y-axis position.
- ///
- private static int yPos = 100;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a static instance of the class.
- ///
- static ColorPicker()
- {
- LuminityBitmap = new Bitmap(9, 238);
- OpacityBitmap = new Bitmap(9, 238);
-
- UpdateLuminosityBitmap(Color.White, true);
- UpdateOpacityBitmap(Color.White, true);
-
- BackgroundSprite = (Render.Sprite)new Render.Sprite(Resources.CPForm, new Vector2(X, Y)).Add(1);
-
- LuminitySprite = (Render.Sprite)new Render.Sprite(LuminityBitmap, new Vector2(X + 285, Y + 40)).Add(0);
- OpacitySprite = (Render.Sprite)new Render.Sprite(OpacityBitmap, new Vector2(X + 349, Y + 40)).Add(0);
-
- PreviewRectangle =
- (Render.Rectangle)
- new Render.Rectangle(X + 375, Y + 44, 54, 80, new ColorBGRA(255, 255, 255, 255)).Add(0);
-
- LuminositySlider = new CPSlider(285 - Resources.CPActiveSlider.Width / 3, 35, 248);
- AlphaSlider = new CPSlider(350 - Resources.CPActiveSlider.Width / 3, 35, 248);
-
- Game.OnWndProc += args => OnWndProc(new WndEventComposition(args));
- }
-
- #endregion
-
- #region Delegates
-
- ///
- /// The on select color delegate.
- ///
- ///
- /// The color.
- ///
- public delegate void OnSelectColor(Color color);
-
- #endregion
-
- #region Public Properties
-
- ///
- /// The color picker X-axis.
- ///
- public static int ColorPickerX
- {
- get
- {
- return X + 18;
- }
- }
-
- ///
- /// The color picker Y-axis.
- ///
- public static int ColorPickerY
- {
- get
- {
- return Y + 61;
- }
- }
-
- ///
- /// Gets or sets a value indicating whether the color picker is visible.
- ///
- public static bool Visible
- {
- get
- {
- return isVisible;
- }
-
- set
- {
- LuminitySprite.Visible =
- OpacitySprite.Visible =
- BackgroundSprite.Visible =
- LuminositySlider.Visible = AlphaSlider.Visible = PreviewRectangle.Visible = isVisible = value;
- }
- }
-
- ///
- /// Gets or sets the X-axis position.
- ///
- public static int X
- {
- get
- {
- return xPos;
- }
-
- set
- {
- var oldX = xPos;
-
- xPos = value;
- BackgroundSprite.X += value - oldX;
- LuminitySprite.X += value - oldX;
- OpacitySprite.X += value - oldX;
- PreviewRectangle.X += value - oldX;
- LuminositySlider.X += value - oldX;
- AlphaSlider.X += value - oldX;
- }
- }
-
- ///
- /// Gets or sets the Y-axis position.
- ///
- public static int Y
- {
- get
- {
- return yPos;
- }
-
- set
- {
- var oldY = yPos;
-
- yPos = value;
- BackgroundSprite.Y += value - oldY;
- LuminitySprite.Y += value - oldY;
- OpacitySprite.Y += value - oldY;
- PreviewRectangle.Y += value - oldY;
- LuminositySlider.Y += value - oldY;
- AlphaSlider.Y += value - oldY;
- }
- }
-
- #endregion
-
- #region Public Methods and Operators
-
- ///
- /// Fires the change color event.
- ///
- ///
- /// The color.
- ///
- public static void FireEvent(Color color)
- {
- if (OnChangeColor != null)
- {
- OnChangeColor(color);
- }
- }
-
- ///
- /// Loads the color picker.
- ///
- ///
- /// The select color delegate.
- ///
- ///
- /// The color.
- ///
- public static void Load(OnSelectColor onSelectColor, Color color)
- {
- OnChangeColor = onSelectColor;
- sColor = color;
- sHue = ((HSLColor)color).Hue;
- sSaturation = ((HSLColor)color).Saturation;
-
- LuminositySlider.Percent = (float)sColor.Luminosity / 100f;
- AlphaSlider.Percent = color.A / 255f;
- X = (Drawing.Width - BackgroundSprite.Width) / 2;
- Y = (Drawing.Height - BackgroundSprite.Height) / 2;
-
- Visible = true;
- UpdateLuminosityBitmap(color);
- UpdateOpacityBitmap(color);
- initialColor = color;
- }
-
- #endregion
-
- #region Methods
-
- ///
- /// Closes the color picker.
- ///
- private static void Close()
- {
- isSelecting =
- isMoving =
- AlphaSlider.Moving =
- LuminositySlider.Moving = AlphaSlider.Visible = LuminositySlider.Visible = Visible = false;
- }
-
- ///
- /// The windows process event messages.
- ///
- ///
- /// The event args.
- ///
- private static void OnWndProc(WndEventComposition args)
- {
- if (!isVisible)
- {
- return;
- }
-
- LuminositySlider.OnWndProc(args);
- AlphaSlider.OnWndProc(args);
-
- var pos = Utils.GetCursorPos();
-
- if (args.Msg == WindowsMessages.WM_LBUTTONDOWN)
- {
- isMoving = Utils.IsUnderRectangle(pos, X, Y, BackgroundSprite.Width, 25);
-
- // Apply Button
- if (Utils.IsUnderRectangle(pos, X + 290, Y + 297, 74, 12))
- {
- Close();
- return;
- }
-
- // Cancel Button
- if (Utils.IsUnderRectangle(pos, X + 370, Y + 296, 73, 14))
- {
- FireEvent(initialColor);
- Close();
- return;
- }
-
- if (Utils.IsUnderRectangle(pos, ColorPickerX, ColorPickerY, ColorPickerW, ColorPickerH))
- {
- isSelecting = true;
- UpdateColor();
- }
- }
- else if (args.Msg == WindowsMessages.WM_LBUTTONUP)
- {
- isMoving = isSelecting = false;
- }
- else if (args.Msg == WindowsMessages.WM_MOUSEMOVE)
- {
- if (isSelecting)
- {
- if (Utils.IsUnderRectangle(pos, ColorPickerX, ColorPickerY, ColorPickerW, ColorPickerH))
- {
- UpdateColor();
- }
- }
-
- if (isMoving)
- {
- X += (int)(pos.X - previousPos.X);
- Y += (int)(pos.Y - previousPos.Y);
- }
-
- previousPos = pos;
- }
- }
-
- ///
- /// Updates the color picker color.
- ///
- internal static void UpdateColor()
- {
- if (isSelecting)
- {
- var pos = Utils.GetCursorPos();
- var color = BackgroundSprite.Bitmap.GetPixel((int)pos.X - X, (int)pos.Y - Y);
- sHue = ((HSLColor)color).Hue;
- sSaturation = ((HSLColor)color).Saturation;
- UpdateLuminosityBitmap(color);
- }
-
- sColor.Hue = sHue;
- sColor.Saturation = sSaturation;
- sColor.Luminosity = (LuminositySlider.Percent * 100d);
- var r = Color.FromArgb(((int)(AlphaSlider.Percent * 255)), sColor);
- PreviewRectangle.Color = new ColorBGRA(r.R, r.G, r.B, r.A);
- UpdateOpacityBitmap(r);
- FireEvent(r);
- }
-
- ///
- /// Updates the luminosity bitmap.
- ///
- ///
- /// The color.
- ///
- ///
- /// Indicates whether to force update.
- ///
- private static void UpdateLuminosityBitmap(HSLColor color, bool force = false)
- {
- if (Utils.TickCount - LastBitmapUpdate[0] < 100 && !force)
- {
- return;
- }
-
- LastBitmapUpdate[0] = Utils.TickCount;
- color.Luminosity = 0d;
-
- for (var y = 0; y < LuminityBitmap.Height; y++)
- {
- for (var x = 0; x < LuminityBitmap.Width; x++)
- {
- LuminityBitmap.SetPixel(x, y, color);
- }
-
- color.Luminosity += 100d / LuminityBitmap.Height;
- }
-
- if (LuminitySprite != null)
- {
- LuminitySprite.UpdateTextureBitmap(LuminityBitmap);
- }
- }
-
- ///
- /// Updates the opacity bitmap.
- ///
- ///
- /// The color.
- ///
- ///
- /// Indicates whether to force update.
- ///
- private static void UpdateOpacityBitmap(HSLColor color, bool force = false)
- {
- if (Utils.TickCount - LastBitmapUpdate[1] < 100 && !force)
- {
- return;
- }
-
- LastBitmapUpdate[1] = Utils.TickCount;
- color.Luminosity = 0d;
-
- for (var y = 0; y < OpacityBitmap.Height; y++)
- {
- for (var x = 0; x < OpacityBitmap.Width; x++)
- {
- OpacityBitmap.SetPixel(x, y, color);
- }
-
- color.Luminosity += 40d / LuminityBitmap.Height;
- }
-
- if (OpacitySprite != null)
- {
- OpacitySprite.UpdateTextureBitmap(OpacityBitmap);
- }
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/Menu/CommonMenu.cs b/Menu/CommonMenu.cs
deleted file mode 100644
index 694912b4..00000000
--- a/Menu/CommonMenu.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-namespace LeagueSharp.Common
-{
- ///
- /// The LeagueSharp.Common official menu.
- ///
- internal class CommonMenu
- {
- #region Static Fields
-
- ///
- /// The menu instance.
- ///
- internal static Menu Instance = new Menu("LeagueSharp.Common", "LeagueSharp.Common", true);
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a static instance of the class.
- ///
- static CommonMenu()
- {
- Initialize();
- }
-
- public static void Initialize()
- {
- TargetSelector.Initialize();
- Prediction.Initialize();
- Hacks.Initialize();
- FakeClicks.Initialize();
-
- Instance.AddToMainMenu();
- }
-
- public static void Shutdown()
- {
- TargetSelector.Shutdown();
- Prediction.Shutdown();
- Hacks.Shutdown();
- FakeClicks.Shutdown();
-
- Menu.Remove(Instance);
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/Menu/KeyBind.cs b/Menu/KeyBind.cs
deleted file mode 100644
index 657c8fb5..00000000
--- a/Menu/KeyBind.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
-
- ///
- /// The menu keybind.
- ///
- [Serializable]
- public struct KeyBind
- {
- #region Fields
-
- ///
- /// Indicates whether the keybind is active.
- ///
- public bool Active;
-
- ///
- /// The key.
- ///
- public uint Key;
-
- ///
- /// The key bind type.
- ///
- public KeyBindType Type;
-
- ///
- /// The key.
- ///
- public uint SecondaryKey;
-
- #endregion
-
- #region Constructors and Destructors
-
- ///
- /// Initializes a new instance of the struct.
- ///
- ///
- /// The key.
- ///
- ///
- /// The type.
- ///
- ///
- /// The default value.
- ///
- public KeyBind(uint key, KeyBindType type, bool defaultValue = false)
- {
- this.Key = key;
- this.SecondaryKey = 0;
- this.Type = type;
- this.Active = defaultValue;
- }
-
- ///
- /// Initializes a new instance of the struct.
- ///
- /// The key.
- /// The secondary key.
- /// The type.
- /// The default value.
- public KeyBind(uint key, uint secondaryKey, KeyBindType type, bool defaultValue = false)
- {
- this.Key = key;
- this.SecondaryKey = secondaryKey;
- this.Type = type;
- this.Active = defaultValue;
- }
- #endregion
- }
-}
\ No newline at end of file
diff --git a/Menu/KeybindSetStage.cs b/Menu/KeybindSetStage.cs
deleted file mode 100644
index fe1be363..00000000
--- a/Menu/KeybindSetStage.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace LeagueSharp.Common
-{
- enum KeybindSetStage
- {
- Keybind1,
-
- Keybind2,
-
- NotSetting
- }
-}
\ No newline at end of file
diff --git a/Menu/Menu.cs b/Menu/Menu.cs
deleted file mode 100644
index 4b63f416..00000000
--- a/Menu/Menu.cs
+++ /dev/null
@@ -1,854 +0,0 @@
-namespace LeagueSharp.Common
-{
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Linq;
- using System.Reflection;
-
- using SharpDX;
- using SharpDX.Direct3D9;
-
- using Color = SharpDX.Color;
- using Rectangle = SharpDX.Rectangle;
-
- ///
- /// The menu.
- ///
- public class Menu
- {
- #region Static Fields
-
- ///
- /// The menu settings, root menu alias.
- ///
- public static readonly Menu Root = new Menu("Menu Settings", "Menu Settings");
-
- ///
- /// The root menus.
- ///
- public static Dictionary RootMenus = new Dictionary();
-
- ///
- /// If the menu should be compact
- ///
- internal static bool IsCompact
- {
- get { return Root.Item("Menu.Compact").GetValue(); }
- }
-
- #endregion
-
- #region Fields
-
- ///
- /// The menu children.
- ///
- public List