EVERYTHING CAN CHANGE AT ANY TIME SINCE THIS IS STILL AN ALPHA VERSION
AyayaLeague is an external script platform written in nodejs that supports custom user scripts.
- Show player attack range
- Show enemy champions attack range
- Show enemy champions summoner spells cooldown
- Settings window [CTRL + SPACE] (shortcut sometimes doesn't word while League is focused)
- Show enemy champions ultimate cooldown
- Show missiles (fixed length for now)
- Custom user scripts (Read more here)
-
Download prebuilt version of AyayaLeague HERE
-
Extract the folder content
-
Run
AyayaLeague.exe
(run it from a terminal if you want to read console.log outputs)
-
Clone the repo
git clone https://github.com/botkalista/ayaya-league-external.git
-
Install Node.js 32bit v16.10.0
Download for Windows: https://nodejs.org/dist/v16.10.0/node-v16.10.0-x86.msi
Download for other OS: https://nodejs.org/fa/blog/release/v16.10.0/
-
Install windows build tools if you don't have them
npm install --g --production windows-build-tools
-
Run
npm run check-dependencies
to check that everything is ok and automatically build packages -
Enter into a league game (must be
windowed
orno borders
) -
Run
npm start
-
Enjoy :3
To use correctly the script you must adjust some settings inside League.
- Set screen mode to
no borders
- Set Player Move Click to U inside Settings > Shortcuts -> Player Movement
- Set Player Attack Only to I inside Settings > Shortcuts -> Player Movement
Every user script is located into: /scripts/userscripts/
(on prebuilt version /resources/app/scripts/userscripts/
)
AyayaLeague comes with 2 default UserScripts called SimpleEvade.js
and Orbwalker.js
.
-
Create your script file inside the
/scripts/userscripts/
folder and call it_yourscriptname_.js
-
Write a
setup
function to manage initializationfunction setup() { console.log('Script is loaded'); }
-
Write a
onTick
function to execute actions every tick. It accepts 2 arguments:manager
andticks
.function onTick(manager, ticks) { if (manager.me.spells[3].ready == true) { console.log('R is up'); } }
-
Write a
onMissileCreate
function to execute actions every time a new missile is createdfunction onMissileCreate(missile, manager) { if (missile.isAutoAttack) console.log('Auto attack missile created'); if (missile.isTurretShot) console.log('Turret shot missile created'); }
-
Optionally you can add the JSDoc before the functions to get intellisense inside visual studio code
/** * @param {import("../UserScriptManager").UserScriptManager} manager * @param {number} ticks Ticks counter **/ function onTick(manager, ticks) { if (manager.me.spells[3].ready == true) { console.log('R is up'); } } /** * @param {import("../../src/models/Missile").Missile} missile * @param {import("../UserScriptManager").UserScriptManager} manager **/ function onMissileCreate(missile, manager) { if (missile.isAutoAttack) console.log('Auto attack missile created'); if (missile.isTurretShot) console.log('Turret shot missile created'); }
-
Export the functions we just created
module.exports = { setup, onTick, onMissileCreate }
-
Start AyayaLeague (
npm run start
) and enjoy your script :3
onTick(manager: UserScriptManager
, ticks:number) - Called every tick. Used to execute actions inside user scripts.
setup() - Called at script load. Used to initialize the script.
onMissileCreate(missile: Missile
, manager: UserScriptManager
) - Called every time a new missile is created
How data is read Every time a property is used it gets read from the game and cached for subsequent calls on the same tick. The manager reads the game data only if a script use that specific piece of data
properties
-
game
Game
- Get game informations and execute actions -
me
Entity
- Get local player -
missiles
Missile
- Get all missiles -
monsters
Entity[]
- Get all monsters -
champions:
-
turrets:
-
minions:
methods
- checkCollision(target:
Entity
, missile:Missile
):CollisionResult
- Checks the collision between target and missile
properties
-
netId
number
- Entity network identifier -
name
string
- Entity name -
gamePos
Vector3
- Entity position relative to the game map -
screenPos
Vector3
- Entity position relative to the screen -
hp
number
- Entity current health points -
maxHp
number
- Entity max health points -
visible
boolean
- True if the entity is outside fog of war -
range
number
- Entity attack range -
team
number
- Entity team identifier (100
= Team1,200
= Neutral,300
= Team2) -
spells
Spell[]
- Entity spells -
AiManager
AiManager
- Used to check player movement -
satHitbox - Used internally to check collisions
properties
-
name
string
- Spell name -
readyAt
number
- Timestamp when the spell will be ready -
level
number
- Spell level (always 1 for summoner spells) -
ready
boolean
- True if the spell is not on cooldown -
readyIn
boolean
- Seconds to wait before the spell is ready
properties
-
gameStartPos
Vector3
- Missile start position relative to the game map -
gameEndPos
Vector3
- Missile end position relative to the game map -
screenStartPos
Vector3
- Missile start position relative to the screen -
screenEndPos
Vector3
- Missile end position relative to the screen -
team
number
- Missile team identifier (100
= Team1,200
= Neutral,300
= Team2) -
isBasicAttack
boolean
- True if the missile is a basic attack -
isTurretAttack
boolean
- True if the missile is a turret shot -
isMinionAttack
boolean
- True if the missile is a minion attack -
spellName
string
- Name of the spell that created the missile -
satHitbox - Used internally to check collisions
properties
-
startPath
Vector3
- Start position of the player movement -
endPath
Vector3
- End position of the player movement -
isDashing
boolean
- True if the entity is dashing -
isMoving
boolean
- True if the entity is moving -
dashSpeed
number
- Speed of the dash
properties
-
result
boolean
- True if there is a collision -
evadeAt
Vector3
- Screen position to move the player in order to dodge the missile
properties
- time
number
- get seconds passed after game start
methods
-
issueOrder(pos:
Vector2
, isAttack:boolean
, delay?:boolean
):void
- Moves the player topos
position. If isAttack is true attacks atpos
position.
NOTE: You must set PlayerMoveClick to U and PlayerAttackOnly to I. Read more here -
isKeyPressed(key:
number
):boolean
- Return true if the key is pressed. You can get the key numbers here
properties
-
x
number
- x -
y
number
- y
methods
-
copy:
Vector2
- Returns a copy of the vector -
getFlat:
Vector2
- Returns a copy of the vector with x, y asinteger
(instead offloat
) -
mult(x:
number
, y:number
):Vector2
- Returns a copy of the vector with his x, y multiplied byx
,y
-
static
zero:Vector2
- Returns a vector with x=0 y=0 -
static
fromVector(v:Vector2
):Vector2
- Returns a copy of the vectorv
-
static
fromData(x:number
, y:number
):Vector2
- Returns a vector with x=x
y=y
properties
-
x
number
- x -
y
number
- y -
z
number
- z
methods
-
copy:
Vector3
- Returns a copy of the vector -
getFlat:
Vector3
- Returns a copy of the vector with x, y, z asinteger
(instead offloat
) -
mult(x:
number
, y:number
, z:number
):Vector3
- Returns a copy of the vector with his x, y, z multiplied byx
,y
,z
-
static
zero:Vector3
- returns a vector with x=0 y=0 z=0 -
static
fromVector(v:Vector3
):Vector3
- Returns a copy of the vectorv
-
static
fromData(x:number
, y:number
, z:number
):Vector3
- Returns a vector with x=x
y=y
z=z
- Fuck you. It's fast enough.
- Add width and height of missiles
- Use better serialization for settings
Simple evade
SimpleEvade.js
simple_evade.mp4
Cooldown tracker
Settings window
UserScript example