2024-05-04 14:44:23 +02:00
function doLogin ( ) {
localStorage . setItem ( "email" , $ ( "#email" ) . val ( ) ) ;
localStorage . setItem ( "password" , $ ( "#password" ) . val ( ) ) ;
2024-05-28 13:28:57 +02:00
$ ( "#email, #password" ) . val ( "" ) ;
2024-05-04 14:44:23 +02:00
loginFromLocalStorage ( ) ;
}
function loginFromLocalStorage ( ) {
2024-05-29 16:19:41 +02:00
doLoginRequest (
data => {
if ( single . getCurrentPath ( ) == "/webui/" ) {
single . loadRoute ( "/webui/inventory" ) ;
}
$ ( ".displayname" ) . text ( data . DisplayName ) ;
window . accountId = data . id ;
window . authz = "accountId=" + data . id + "&nonce=" + data . Nonce ;
updateInventory ( ) ;
} ,
( ) => {
logout ( ) ;
alert ( "Login failed" ) ;
}
) ;
}
function doLoginRequest ( succ _cb , fail _cb ) {
2024-05-04 14:44:23 +02:00
const req = $ . post ( {
url : "/api/login.php" ,
contentType : "text/plain" ,
data : JSON . stringify ( {
email : localStorage . getItem ( "email" ) ,
password : wp . encSync ( localStorage . getItem ( "password" ) , "hex" ) ,
time : parseInt ( new Date ( ) / 1000 ) ,
s : "W0RFXVN0ZXZlIGxpa2VzIGJpZyBidXR0cw==" , // signature of some kind
lang : "en" ,
date : 1501230947855458660 , // ???
2024-05-06 15:14:09 +02:00
ClientType : "webui" ,
2024-05-04 14:44:23 +02:00
PS : "W0RFXVN0ZXZlIGxpa2VzIGJpZyBidXR0cw==" // anti-cheat data
} )
} ) ;
2024-05-29 16:19:41 +02:00
req . done ( succ _cb ) ;
req . fail ( fail _cb ) ;
}
function revalidateAuthz ( succ _cb ) {
return doLoginRequest (
data => {
window . authz = "accountId=" + data . id + "&nonce=" + data . Nonce ;
succ _cb ( ) ;
} ,
( ) => {
logout ( ) ;
alert ( "Your credentials are no longer valid." ) ;
single . loadRoute ( "/webui/" ) ; // Show login screen
2024-05-28 13:28:57 +02:00
}
2024-05-29 16:19:41 +02:00
) ;
2024-05-04 14:44:23 +02:00
}
function logout ( ) {
localStorage . removeItem ( "email" ) ;
localStorage . removeItem ( "password" ) ;
}
2024-12-23 14:37:07 +01:00
function renameAccount ( ) {
const newname = window . prompt ( "What would you like to change your account name to?" ) ;
if ( newname ) {
fetch ( "/custom/renameAccount?" + window . authz + "&newname=" + newname ) . then ( ( ) => {
$ ( ".displayname" ) . text ( newname ) ;
} ) ;
}
}
2024-12-23 03:34:14 +01:00
function deleteAccount ( ) {
if (
window . confirm (
"Are you sure you want to delete your account " +
$ ( ".displayname" ) . text ( ) +
" (" +
localStorage . getItem ( "email" ) +
")? This action cannot be undone."
)
) {
2024-12-23 14:37:07 +01:00
fetch ( "/custom/deleteAccount?" + window . authz ) . then ( ( ) => {
2024-12-23 03:34:14 +01:00
logout ( ) ;
single . loadRoute ( "/webui/" ) ; // Show login screen
} ) ;
}
}
2024-05-04 14:44:23 +02:00
if ( localStorage . getItem ( "email" ) && localStorage . getItem ( "password" ) ) {
loginFromLocalStorage ( ) ;
}
2024-05-28 13:28:57 +02:00
single . on ( "route_load" , function ( event ) {
if ( event . route . paths [ 0 ] != "/webui/" ) {
// Authorised route?
if ( ! localStorage . getItem ( "email" ) ) {
// Not logged in?
return single . loadRoute ( "/webui/" ) ; // Show login screen
}
$ ( "body" ) . addClass ( "logged-in" ) ;
} else {
$ ( "body" ) . removeClass ( "logged-in" ) ;
}
2024-06-01 12:57:27 +02:00
$ ( ".nav-link" ) . removeClass ( "active" ) ;
const navLink = document . querySelector ( ".nav-link[href='" + event . route . paths [ 0 ] + "']" ) ;
if ( navLink ) {
navLink . classList . add ( "active" ) ;
}
2024-05-28 13:28:57 +02:00
} ) ;
2024-12-22 20:38:50 +01:00
function setActiveLanguage ( lang ) {
window . lang = lang ;
const lang _name = document . querySelector ( "[data-lang=" + lang + "]" ) . textContent ;
document . getElementById ( "active-lang-name" ) . textContent = lang _name ;
document . querySelector ( "[data-lang].active" ) . classList . remove ( "active" ) ;
document . querySelector ( "[data-lang=" + lang + "]" ) . classList . add ( "active" ) ;
}
setActiveLanguage ( localStorage . getItem ( "lang" ) ? ? "en" ) ;
function setLanguage ( lang ) {
setActiveLanguage ( lang ) ;
localStorage . setItem ( "lang" , lang ) ;
fetchItemList ( ) ;
updateInventory ( ) ;
}
2024-06-30 13:13:26 +02:00
2024-12-22 20:38:50 +01:00
function fetchItemList ( ) {
window . itemListPromise = new Promise ( resolve => {
const req = $ . get ( "/custom/getItemLists?lang=" + window . lang ) ;
req . done ( data => {
window . archonCrystalUpgrades = data . archonCrystalUpgrades ;
const itemMap = {
// Generics for rivens
"/Lotus/Weapons/Tenno/Archwing/Primary/ArchGun" : { name : "Archgun" } ,
"/Lotus/Weapons/Tenno/Melee/PlayerMeleeWeapon" : { name : "Melee" } ,
"/Lotus/Weapons/Tenno/Pistol/LotusPistol" : { name : "Pistol" } ,
"/Lotus/Weapons/Tenno/Rifle/LotusRifle" : { name : "Rifle" } ,
"/Lotus/Weapons/Tenno/Shotgun/LotusShotgun" : { name : "Shotgun" } ,
// Modular weapons
2025-01-03 09:09:53 +01:00
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary" : { name : "Kitgun" } ,
2024-12-22 20:38:50 +01:00
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam" : { name : "Kitgun" } ,
2025-01-03 09:09:53 +01:00
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryLauncher" : { name : "Kitgun" } ,
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun" : { name : "Kitgun" } ,
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimarySniper" : { name : "Kitgun" } ,
2024-12-22 20:38:50 +01:00
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary" : { name : "Kitgun" } ,
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam" : { name : "Kitgun" } ,
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun" : { name : "Kitgun" } ,
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon" : { name : "Zaw" } ,
// Missing in data sources
"/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod" : { name : "Traumatic Peculiar" }
} ;
for ( const [ type , items ] of Object . entries ( data ) ) {
if ( type == "archonCrystalUpgrades" ) {
Object . entries ( items ) . forEach ( ( [ uniqueName , name ] ) => {
2024-06-01 12:57:27 +02:00
const option = document . createElement ( "option" ) ;
2024-12-22 20:38:50 +01:00
option . setAttribute ( "data-key" , uniqueName ) ;
option . value = name ;
2024-06-01 12:57:27 +02:00
document . getElementById ( "datalist-" + type ) . appendChild ( option ) ;
2024-12-22 20:38:50 +01:00
} ) ;
} else if ( type != "badItems" ) {
items . forEach ( item => {
if ( item . uniqueName in data . badItems ) {
item . name += " (Imposter)" ;
} else if ( item . uniqueName . substr ( 0 , 18 ) != "/Lotus/Types/Game/" ) {
const option = document . createElement ( "option" ) ;
option . setAttribute ( "data-key" , item . uniqueName ) ;
option . value = item . name ;
document . getElementById ( "datalist-" + type ) . appendChild ( option ) ;
}
itemMap [ item . uniqueName ] = { ... item , type } ;
} ) ;
}
2024-06-01 12:57:27 +02:00
}
2024-12-22 20:38:50 +01:00
resolve ( itemMap ) ;
} ) ;
2024-05-06 15:14:09 +02:00
} ) ;
2024-12-22 20:38:50 +01:00
}
fetchItemList ( ) ;
2024-05-04 14:44:23 +02:00
2024-05-06 15:14:09 +02:00
function updateInventory ( ) {
2024-06-16 12:24:15 +02:00
const req = $ . get ( "/api/inventory.php?" + window . authz + "&xpBasedLevelCapDisabled=1" ) ;
2024-05-06 15:14:09 +02:00
req . done ( data => {
window . itemListPromise . then ( itemMap => {
2024-06-30 13:13:26 +02:00
window . didInitialInventoryUpdate = true ;
// Populate inventory route
2024-05-06 15:14:09 +02:00
document . getElementById ( "warframe-list" ) . innerHTML = "" ;
data . Suits . forEach ( item => {
const tr = document . createElement ( "tr" ) ;
2025-01-15 05:20:17 +01:00
tr . setAttribute ( "data-item-type" , item . ItemType ) ;
2024-05-06 15:14:09 +02:00
{
const td = document . createElement ( "td" ) ;
2024-05-08 22:40:21 +02:00
td . textContent = itemMap [ item . ItemType ] ? . name ? ? item . ItemType ;
2024-06-16 21:49:41 +02:00
if ( item . ItemName ) {
td . textContent = item . ItemName + " (" + td . textContent + ")" ;
}
2024-05-06 15:14:09 +02:00
tr . appendChild ( td ) ;
}
{
const td = document . createElement ( "td" ) ;
td . classList = "text-end" ;
if ( item . XP < 1_600_000 ) {
const a = document . createElement ( "a" ) ;
a . href = "#" ;
2024-05-08 22:40:21 +02:00
a . onclick = function ( event ) {
event . preventDefault ( ) ;
2024-05-06 15:14:09 +02:00
addGearExp ( "Suits" , item . ItemId . $oid , 1_600_000 - item . XP ) ;
2024-12-29 06:37:40 +01:00
if ( "exalted" in itemMap [ item . ItemType ] ) {
for ( const exaltedType of itemMap [ item . ItemType ] . exalted ) {
const exaltedItem = data . SpecialItems . find ( x => x . ItemType == exaltedType ) ;
if ( exaltedItem ) {
const exaltedCap =
itemMap [ exaltedType ] ? . type == "weapons" ? 800_000 : 1_600_000 ;
if ( exaltedItem . XP < exaltedCap ) {
addGearExp (
"SpecialItems" ,
exaltedItem . ItemId . $oid ,
exaltedCap - exaltedItem . XP
) ;
}
}
}
}
2024-05-06 15:14:09 +02:00
} ;
2024-06-16 21:49:41 +02:00
a . title = "Make Rank 30" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg> ` ;
td . appendChild ( a ) ;
}
2024-06-30 13:13:26 +02:00
{
const a = document . createElement ( "a" ) ;
a . href = "/webui/powersuit/" + item . ItemId . $oid ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M278.5 215.6L23 471c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l57-57h68c49.7 0 97.9-14.4 139-41c11.1-7.2 5.5-23-7.8-23c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l81-24.3c2.5-.8 4.8-2.1 6.7-4l22.4-22.4c10.1-10.1 2.9-27.3-11.3-27.3l-32.2 0c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l112-33.6c4-1.2 7.4-3.9 9.3-7.7C506.4 207.6 512 184.1 512 160c0-41-16.3-80.3-45.3-109.3l-5.5-5.5C432.3 16.3 393 0 352 0s-80.3 16.3-109.3 45.3L139 149C91 197 64 262.1 64 330v55.3L253.6 195.8c6.2-6.2 16.4-6.2 22.6 0c5.4 5.4 6.1 13.6 2.2 19.8z"/></svg> ` ;
td . appendChild ( a ) ;
}
2024-06-16 21:49:41 +02:00
{
const a = document . createElement ( "a" ) ;
a . href = "#" ;
a . onclick = function ( event ) {
event . preventDefault ( ) ;
const name = prompt ( "Enter new custom name:" ) ;
2024-06-30 13:13:26 +02:00
if ( name !== null ) {
renameGear ( "Suits" , item . ItemId . $oid , name ) ;
}
2024-06-16 21:49:41 +02:00
} ;
a . title = "Rename" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M0 80V229.5c0 17 6.7 33.3 18.7 45.3l176 176c25 25 65.5 25 90.5 0L418.7 317.3c25-25 25-65.5 0-90.5l-176-176c-12-12-28.3-18.7-45.3-18.7H48C21.5 32 0 53.5 0 80zm112 32a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg> ` ;
2024-05-06 15:14:09 +02:00
td . appendChild ( a ) ;
2024-05-06 21:49:49 +02:00
}
{
const a = document . createElement ( "a" ) ;
a . href = "#" ;
2024-05-08 22:40:21 +02:00
a . onclick = function ( event ) {
event . preventDefault ( ) ;
2024-05-06 21:49:49 +02:00
disposeOfGear ( "Suits" , item . ItemId . $oid ) ;
} ;
2024-06-16 21:49:41 +02:00
a . title = "Remove" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg> ` ;
2024-05-06 21:49:49 +02:00
td . appendChild ( a ) ;
2024-05-06 15:14:09 +02:00
}
tr . appendChild ( td ) ;
}
document . getElementById ( "warframe-list" ) . appendChild ( tr ) ;
} ) ;
document . getElementById ( "weapon-list" ) . innerHTML = "" ;
[ "LongGuns" , "Pistols" , "Melee" ] . forEach ( category => {
data [ category ] . forEach ( item => {
const tr = document . createElement ( "tr" ) ;
2025-01-15 05:20:17 +01:00
tr . setAttribute ( "data-item-type" , item . ItemType ) ;
2024-05-06 15:14:09 +02:00
{
const td = document . createElement ( "td" ) ;
2024-05-08 22:40:21 +02:00
td . textContent = itemMap [ item . ItemType ] ? . name ? ? item . ItemType ;
2024-06-16 21:49:41 +02:00
if ( item . ItemName ) {
td . textContent = item . ItemName + " (" + td . textContent + ")" ;
}
2024-05-06 15:14:09 +02:00
tr . appendChild ( td ) ;
}
{
const td = document . createElement ( "td" ) ;
td . classList = "text-end" ;
if ( item . XP < 800_000 ) {
const a = document . createElement ( "a" ) ;
a . href = "#" ;
2024-05-08 22:40:21 +02:00
a . onclick = function ( event ) {
event . preventDefault ( ) ;
2024-05-06 15:14:09 +02:00
addGearExp ( category , item . ItemId . $oid , 800_000 - item . XP ) ;
} ;
2024-06-16 21:49:41 +02:00
a . title = "Make Rank 30" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg> ` ;
td . appendChild ( a ) ;
}
{
const a = document . createElement ( "a" ) ;
a . href = "#" ;
a . onclick = function ( event ) {
event . preventDefault ( ) ;
const name = prompt ( "Enter new custom name:" ) ;
2024-06-30 13:13:26 +02:00
if ( name !== null ) {
renameGear ( category , item . ItemId . $oid , name ) ;
}
2024-06-16 21:49:41 +02:00
} ;
a . title = "Rename" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M0 80V229.5c0 17 6.7 33.3 18.7 45.3l176 176c25 25 65.5 25 90.5 0L418.7 317.3c25-25 25-65.5 0-90.5l-176-176c-12-12-28.3-18.7-45.3-18.7H48C21.5 32 0 53.5 0 80zm112 32a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg> ` ;
2024-05-06 15:14:09 +02:00
td . appendChild ( a ) ;
2024-05-06 21:49:49 +02:00
}
{
const a = document . createElement ( "a" ) ;
a . href = "#" ;
2024-05-08 22:40:21 +02:00
a . onclick = function ( event ) {
event . preventDefault ( ) ;
2024-05-06 21:49:49 +02:00
disposeOfGear ( category , item . ItemId . $oid ) ;
} ;
2024-06-16 21:49:41 +02:00
a . title = "Remove" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg> ` ;
2024-05-06 21:49:49 +02:00
td . appendChild ( a ) ;
2024-05-06 15:14:09 +02:00
}
tr . appendChild ( td ) ;
}
document . getElementById ( "weapon-list" ) . appendChild ( tr ) ;
} ) ;
} ) ;
2024-05-29 23:03:05 +02:00
2024-06-30 13:13:26 +02:00
// Populate mods route
2024-05-29 23:03:05 +02:00
document . getElementById ( "riven-list" ) . innerHTML = "" ;
2024-06-01 12:57:27 +02:00
document . getElementById ( "mods-list" ) . innerHTML = "" ;
2024-05-29 23:03:05 +02:00
data . Upgrades . forEach ( item => {
if ( item . ItemType . substr ( 0 , 32 ) == "/Lotus/Upgrades/Mods/Randomized/" ) {
const rivenType = item . ItemType . substr ( 32 ) ;
const fingerprint = JSON . parse ( item . UpgradeFingerprint ) ;
2025-01-12 08:30:56 +01:00
if ( fingerprint . buffs ) {
// Riven has been revealed?
const tr = document . createElement ( "tr" ) ;
2024-05-29 23:03:05 +02:00
{
2025-01-12 08:30:56 +01:00
const td = document . createElement ( "td" ) ;
td . textContent = itemMap [ fingerprint . compat ] ? . name ? ? fingerprint . compat ;
td . textContent += " " + RivenParser . parseRiven ( rivenType , fingerprint , 1 ) . name ;
td . innerHTML += " <span title='Number of buffs'>▲ " + fingerprint . buffs . length + "</span>" ;
td . innerHTML +=
" <span title='Number of curses'>▼ " + fingerprint . curses . length + "</span>" ;
td . innerHTML +=
" <span title='Number of rerolls'>⟳ " + parseInt ( fingerprint . rerolls ) + "</span>" ;
tr . appendChild ( td ) ;
2024-05-29 23:03:05 +02:00
}
{
2025-01-12 08:30:56 +01:00
const td = document . createElement ( "td" ) ;
td . classList = "text-end" ;
{
const a = document . createElement ( "a" ) ;
a . href =
"riven-tool/#" +
encodeURIComponent (
JSON . stringify ( {
rivenType : rivenType ,
omegaAttenuation : 1 ,
fingerprint : fingerprint
} )
) ;
a . target = "_blank" ;
a . title = "View Stats" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M160 80c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48V432c0 26.5-21.5 48-48 48H208c-26.5 0-48-21.5-48-48V80zM0 272c0-26.5 21.5-48 48-48H80c26.5 0 48 21.5 48 48V432c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V272zM368 96h32c26.5 0 48 21.5 48 48V432c0 26.5-21.5 48-48 48H368c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48z"/></svg> ` ;
td . appendChild ( a ) ;
}
{
const a = document . createElement ( "a" ) ;
a . href = "#" ;
a . onclick = function ( event ) {
event . preventDefault ( ) ;
disposeOfGear ( "Upgrades" , item . ItemId . $oid ) ;
} ;
a . title = "Remove" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg> ` ;
td . appendChild ( a ) ;
}
tr . appendChild ( td ) ;
2024-05-29 23:03:05 +02:00
}
2025-01-12 08:30:56 +01:00
document . getElementById ( "riven-list" ) . appendChild ( tr ) ;
return ;
2024-05-29 23:03:05 +02:00
}
2025-01-12 08:30:56 +01:00
}
const tr = document . createElement ( "tr" ) ;
const rank = parseInt ( JSON . parse ( item . UpgradeFingerprint ) . lvl ) ;
const maxRank = itemMap [ item . ItemType ] ? . fusionLimit ? ? 5 ;
{
const td = document . createElement ( "td" ) ;
td . textContent = itemMap [ item . ItemType ] ? . name ? ? item . ItemType ;
td . innerHTML += " <span title='Rank'>★ " + rank + "/" + maxRank + "</span>" ;
tr . appendChild ( td ) ;
}
{
const td = document . createElement ( "td" ) ;
td . classList = "text-end" ;
if ( rank < maxRank ) {
const a = document . createElement ( "a" ) ;
a . href = "#" ;
a . onclick = function ( event ) {
event . preventDefault ( ) ;
setFingerprint ( item . ItemType , item . ItemId , { lvl : maxRank } ) ;
} ;
a . title = "Max Rank" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg> ` ;
td . appendChild ( a ) ;
2024-06-01 12:57:27 +02:00
}
{
2025-01-12 08:30:56 +01:00
const a = document . createElement ( "a" ) ;
a . href = "#" ;
a . onclick = function ( event ) {
event . preventDefault ( ) ;
disposeOfGear ( "Upgrades" , item . ItemId . $oid ) ;
} ;
a . title = "Remove" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg> ` ;
td . appendChild ( a ) ;
2024-06-01 12:57:27 +02:00
}
2025-01-12 08:30:56 +01:00
tr . appendChild ( td ) ;
2024-06-01 12:57:27 +02:00
}
2025-01-12 08:30:56 +01:00
document . getElementById ( "mods-list" ) . appendChild ( tr ) ;
2024-06-01 12:57:27 +02:00
} ) ;
data . RawUpgrades . forEach ( item => {
if ( item . ItemCount > 0 ) {
const maxRank = itemMap [ item . ItemType ] ? . fusionLimit ? ? 5 ;
const tr = document . createElement ( "tr" ) ;
{
const td = document . createElement ( "td" ) ;
td . textContent = itemMap [ item . ItemType ] ? . name ? ? item . ItemType ;
td . innerHTML += " <span title='Rank'>★ 0/" + maxRank + "</span>" ;
if ( item . ItemCount > 1 ) {
td . innerHTML += " <span title='Count'>🗍 " + parseInt ( item . ItemCount ) + "</span>" ;
}
tr . appendChild ( td ) ;
}
{
const td = document . createElement ( "td" ) ;
td . classList = "text-end" ;
{
const a = document . createElement ( "a" ) ;
a . href = "#" ;
a . onclick = function ( event ) {
event . preventDefault ( ) ;
setFingerprint ( item . ItemType , item . LastAdded , { lvl : maxRank } ) ;
} ;
2024-06-16 21:49:41 +02:00
a . title = "Max Rank" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg> ` ;
2024-06-01 12:57:27 +02:00
td . appendChild ( a ) ;
}
{
const a = document . createElement ( "a" ) ;
a . href = "#" ;
a . onclick = function ( event ) {
event . preventDefault ( ) ;
disposeOfItems ( "Upgrades" , item . ItemType , item . ItemCount ) ;
} ;
2024-06-16 21:49:41 +02:00
a . title = "Remove" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg> ` ;
2024-06-01 12:57:27 +02:00
td . appendChild ( a ) ;
}
tr . appendChild ( td ) ;
}
document . getElementById ( "mods-list" ) . appendChild ( tr ) ;
2024-05-29 23:03:05 +02:00
}
} ) ;
2024-06-30 13:13:26 +02:00
// Populate powersuit route
if ( single . getCurrentPath ( ) . substr ( 0 , 17 ) == "/webui/powersuit/" ) {
const oid = single . getCurrentPath ( ) . substr ( 17 ) ;
const item = data . Suits . find ( x => x . ItemId . $oid == oid ) ;
if ( item ) {
if ( item . ItemName ) {
$ ( "#powersuit-route h3" ) . text ( item . ItemName ) ;
$ ( "#powersuit-route .text-body-secondary" ) . text ( itemMap [ item . ItemType ] ? . name ? ? item . ItemType ) ;
} else {
$ ( "#powersuit-route h3" ) . text ( itemMap [ item . ItemType ] ? . name ? ? item . ItemType ) ;
$ ( "#powersuit-route .text-body-secondary" ) . text ( "" ) ;
}
const uniqueUpgrades = { } ;
( item . ArchonCrystalUpgrades ? ? [ ] ) . forEach ( upgrade => {
uniqueUpgrades [ upgrade . UpgradeType ] ? ? = 0 ;
uniqueUpgrades [ upgrade . UpgradeType ] += 1 ;
} ) ;
document . getElementById ( "crystals-list" ) . innerHTML = "" ;
Object . entries ( uniqueUpgrades ) . forEach ( ( [ upgradeType , count ] ) => {
const tr = document . createElement ( "tr" ) ;
{
const td = document . createElement ( "td" ) ;
td . textContent = count + "x " + ( archonCrystalUpgrades [ upgradeType ] ? ? upgradeType ) ;
tr . appendChild ( td ) ;
}
{
const td = document . createElement ( "td" ) ;
td . classList = "text-end" ;
{
const a = document . createElement ( "a" ) ;
a . href = "#" ;
a . onclick = function ( event ) {
event . preventDefault ( ) ;
doPopArchonCrystalUpgrade ( upgradeType ) ;
} ;
a . title = "Remove" ;
a . innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg> ` ;
td . appendChild ( a ) ;
}
tr . appendChild ( td ) ;
}
document . getElementById ( "crystals-list" ) . appendChild ( tr ) ;
} ) ;
} else {
single . loadRoute ( "/webui/inventory" ) ;
}
}
2024-05-06 15:14:09 +02:00
} ) ;
} ) ;
}
2024-05-04 14:44:23 +02:00
function getKey ( input ) {
return document
. getElementById ( input . getAttribute ( "list" ) )
. querySelector ( "[value='" + input . value . split ( "'" ) . join ( "\\'" ) + "']" )
? . getAttribute ( "data-key" ) ;
}
function doAcquireWarframe ( ) {
const uniqueName = getKey ( document . getElementById ( "warframe-to-acquire" ) ) ;
if ( ! uniqueName ) {
2024-05-06 15:14:09 +02:00
$ ( "#warframe-to-acquire" ) . addClass ( "is-invalid" ) . focus ( ) ;
2024-05-04 14:44:23 +02:00
return ;
}
2024-05-29 16:19:41 +02:00
revalidateAuthz ( ( ) => {
const req = $ . post ( {
2025-01-15 05:20:17 +01:00
url : "/custom/addItems?" + window . authz ,
2024-05-29 16:19:41 +02:00
contentType : "application/json" ,
2025-01-15 05:20:17 +01:00
data : JSON . stringify ( [
{
type : "Powersuit" ,
internalName : uniqueName
}
] )
2024-05-29 16:19:41 +02:00
} ) ;
req . done ( ( ) => {
document . getElementById ( "warframe-to-acquire" ) . value = "" ;
updateInventory ( ) ;
} ) ;
2024-05-04 14:44:23 +02:00
} ) ;
}
$ ( "#warframe-to-acquire" ) . on ( "input" , ( ) => {
$ ( "#warframe-to-acquire" ) . removeClass ( "is-invalid" ) ;
} ) ;
function doAcquireWeapon ( ) {
const uniqueName = getKey ( document . getElementById ( "weapon-to-acquire" ) ) ;
if ( ! uniqueName ) {
2024-05-06 15:14:09 +02:00
$ ( "#weapon-to-acquire" ) . addClass ( "is-invalid" ) . focus ( ) ;
2024-05-04 14:44:23 +02:00
return ;
}
2024-05-29 16:19:41 +02:00
revalidateAuthz ( ( ) => {
const req = $ . post ( {
2025-01-15 05:20:17 +01:00
url : "/custom/addItems?" + window . authz ,
2024-05-29 16:19:41 +02:00
contentType : "application/json" ,
2025-01-15 05:20:17 +01:00
data : JSON . stringify ( [
{
type : "Weapon" ,
internalName : uniqueName
}
] )
2024-05-29 16:19:41 +02:00
} ) ;
req . done ( ( ) => {
document . getElementById ( "weapon-to-acquire" ) . value = "" ;
updateInventory ( ) ;
} ) ;
2024-05-04 14:44:23 +02:00
} ) ;
}
$ ( "#weapon-to-acquire" ) . on ( "input" , ( ) => {
$ ( "#weapon-to-acquire" ) . removeClass ( "is-invalid" ) ;
} ) ;
2024-05-06 15:14:09 +02:00
2025-01-15 05:20:17 +01:00
function dispatchAddItemsRequestsBatch ( requests ) {
revalidateAuthz ( ( ) => {
const req = $ . post ( {
url : "/custom/addItems?" + window . authz ,
contentType : "application/json" ,
data : JSON . stringify ( requests )
} ) ;
req . done ( ( ) => {
updateInventory ( ) ;
} ) ;
} ) ;
}
function addMissingWarframes ( ) {
const requests = [ ] ;
document . querySelectorAll ( "#datalist-warframes option" ) . forEach ( elm => {
if ( ! document . querySelector ( "#warframe-list [data-item-type='" + elm . getAttribute ( "data-key" ) + "']" ) ) {
requests . push ( { type : "Powersuit" , internalName : elm . getAttribute ( "data-key" ) } ) ;
}
} ) ;
if (
requests . length != 0 &&
window . confirm ( "Are you sure you want to add " + requests . length + " items to your account?" )
) {
dispatchAddItemsRequestsBatch ( requests ) ;
}
}
function addMissingWeapons ( ) {
const requests = [ ] ;
document . querySelectorAll ( "#datalist-weapons option" ) . forEach ( elm => {
if ( ! document . querySelector ( "#weapon-list [data-item-type='" + elm . getAttribute ( "data-key" ) + "']" ) ) {
requests . push ( { type : "Weapon" , internalName : elm . getAttribute ( "data-key" ) } ) ;
}
} ) ;
if (
requests . length != 0 &&
window . confirm ( "Are you sure you want to add " + requests . length + " items to your account?" )
) {
dispatchAddItemsRequestsBatch ( requests ) ;
}
}
2024-05-06 15:14:09 +02:00
function addGearExp ( category , oid , xp ) {
2024-05-09 22:34:47 +02:00
const data = { } ;
2024-05-06 15:14:09 +02:00
data [ category ] = [
{
ItemId : { $oid : oid } ,
XP : xp
}
] ;
2024-05-29 16:19:41 +02:00
revalidateAuthz ( ( ) => {
$ . post ( {
url : "/api/missionInventoryUpdate.php?" + window . authz ,
contentType : "text/plain" ,
data : JSON . stringify ( data )
} ) . done ( function ( ) {
2024-12-29 06:37:40 +01:00
if ( category != "SpecialItems" ) {
updateInventory ( ) ;
}
2024-05-29 16:19:41 +02:00
} ) ;
2024-05-06 15:14:09 +02:00
} ) ;
}
2024-05-06 21:49:49 +02:00
2024-06-16 21:49:41 +02:00
function renameGear ( category , oid , name ) {
revalidateAuthz ( ( ) => {
$ . post ( {
url : "/api/nameWeapon.php?" + window . authz + "&Category=" + category + "&ItemId=" + oid + "&webui=1" ,
contentType : "text/plain" ,
data : JSON . stringify ( {
ItemName : name
} )
} ) . done ( function ( ) {
updateInventory ( ) ;
} ) ;
} ) ;
}
2024-05-06 21:49:49 +02:00
function disposeOfGear ( category , oid ) {
const data = {
SellCurrency : "SC_RegularCredits" ,
SellPrice : 0 ,
Items : { }
} ;
data . Items [ category ] = [
{
2024-05-29 23:03:05 +02:00
String : oid ,
Count : 0
2024-05-06 21:49:49 +02:00
}
] ;
2024-05-29 16:19:41 +02:00
revalidateAuthz ( ( ) => {
$ . post ( {
url : "/api/sell.php?" + window . authz ,
contentType : "text/plain" ,
data : JSON . stringify ( data )
} ) . done ( function ( ) {
updateInventory ( ) ;
} ) ;
2024-05-06 21:49:49 +02:00
} ) ;
}
2024-05-09 22:34:47 +02:00
2024-06-01 12:57:27 +02:00
function disposeOfItems ( category , type , count ) {
const data = {
SellCurrency : "SC_RegularCredits" ,
SellPrice : 0 ,
Items : { }
} ;
data . Items [ category ] = [
{
String : type ,
Count : count
}
] ;
revalidateAuthz ( ( ) => {
$ . post ( {
url : "/api/sell.php?" + window . authz ,
contentType : "text/plain" ,
data : JSON . stringify ( data )
} ) . done ( function ( ) {
updateInventory ( ) ;
} ) ;
} ) ;
}
2024-05-09 22:34:47 +02:00
function doAcquireMiscItems ( ) {
2024-06-20 21:22:01 +02:00
const data = getKey ( document . getElementById ( "miscitem-type" ) ) ;
if ( ! data ) {
2024-05-09 22:34:47 +02:00
$ ( "#miscitem-type" ) . addClass ( "is-invalid" ) . focus ( ) ;
return ;
}
2024-06-20 21:22:01 +02:00
const [ category , uniqueName ] = data . split ( ":" ) ;
2024-05-29 16:19:41 +02:00
revalidateAuthz ( ( ) => {
$ . post ( {
url : "/api/missionInventoryUpdate.php?" + window . authz ,
contentType : "text/plain" ,
data : JSON . stringify ( {
2024-06-20 21:22:01 +02:00
[ category ] : [
2024-05-29 16:19:41 +02:00
{
ItemType : uniqueName ,
2024-06-18 02:03:07 +02:00
ItemCount : parseInt ( $ ( "#miscitem-count" ) . val ( ) )
2024-05-29 16:19:41 +02:00
}
]
} )
} ) . done ( function ( ) {
alert ( "Successfully added." ) ;
} ) ;
2024-05-09 22:34:47 +02:00
} ) ;
}
2024-06-20 21:22:01 +02:00
$ ( "#miscitem-type" ) . on ( "input" , ( ) => {
$ ( "#miscitem-type" ) . removeClass ( "is-invalid" ) ;
2024-05-09 22:34:47 +02:00
} ) ;
2024-05-28 13:28:57 +02:00
function doAcquireRiven ( ) {
let fingerprint ;
try {
fingerprint = JSON . parse ( $ ( "#addriven-fingerprint" ) . val ( ) ) ;
if ( typeof fingerprint !== "object" ) {
fingerprint = JSON . parse ( fingerprint ) ;
}
} catch ( e ) { }
if (
typeof fingerprint !== "object" ||
! ( "compat" in fingerprint ) ||
! ( "pol" in fingerprint ) ||
! ( "buffs" in fingerprint )
) {
$ ( "#addriven-fingerprint" ) . addClass ( "is-invalid" ) . focus ( ) ;
return ;
}
const uniqueName = "/Lotus/Upgrades/Mods/Randomized/" + $ ( "#addriven-type" ) . val ( ) ;
2024-05-29 16:19:41 +02:00
revalidateAuthz ( ( ) => {
// Add riven type to inventory
$ . post ( {
url : "/api/missionInventoryUpdate.php?" + window . authz ,
contentType : "text/plain" ,
data : JSON . stringify ( {
RawUpgrades : [
{
ItemType : uniqueName ,
ItemCount : 1
}
]
} )
} ) . done ( function ( ) {
// Get riven's assigned id
2024-06-16 12:24:15 +02:00
$ . get ( "/api/inventory.php?" + window . authz + "&xpBasedLevelCapDisabled=1" ) . done ( data => {
2024-05-29 16:19:41 +02:00
for ( const rawUpgrade of data . RawUpgrades ) {
if ( rawUpgrade . ItemType === uniqueName ) {
// Add fingerprint to riven
$ . post ( {
url : "/api/artifacts.php?" + window . authz ,
contentType : "text/plain" ,
data : JSON . stringify ( {
Upgrade : {
ItemType : uniqueName ,
UpgradeFingerprint : JSON . stringify ( fingerprint ) ,
ItemId : rawUpgrade . LastAdded
} ,
LevelDiff : 0 ,
Cost : 0 ,
FusionPointCost : 0
} )
} ) . done ( function ( ) {
2024-05-29 23:03:05 +02:00
$ ( "#addriven-fingerprint" ) . val ( "" ) ;
updateInventory ( ) ;
2024-05-29 16:19:41 +02:00
} ) ;
break ;
}
2024-05-28 13:28:57 +02:00
}
2024-05-29 16:19:41 +02:00
} ) ;
2024-05-28 13:28:57 +02:00
} ) ;
} ) ;
}
$ ( "#addriven-fingerprint" ) . on ( "input" , ( ) => {
$ ( "#addriven-fingerprint" ) . removeClass ( "is-invalid" ) ;
} ) ;
2024-06-01 12:57:27 +02:00
function setFingerprint ( ItemType , ItemId , fingerprint ) {
revalidateAuthz ( ( ) => {
$ . post ( {
url : "/api/artifacts.php?" + window . authz ,
contentType : "text/plain" ,
data : JSON . stringify ( {
Upgrade : {
ItemType ,
ItemId ,
UpgradeFingerprint : JSON . stringify ( fingerprint )
} ,
LevelDiff : 0 ,
Cost : 0 ,
FusionPointCost : 0
} )
} ) . done ( function ( ) {
updateInventory ( ) ;
} ) ;
} ) ;
}
function doAcquireMod ( ) {
const uniqueName = getKey ( document . getElementById ( "mod-to-acquire" ) ) ;
if ( ! uniqueName ) {
$ ( "#mod-to-acquire" ) . addClass ( "is-invalid" ) . focus ( ) ;
return ;
}
revalidateAuthz ( ( ) => {
$ . post ( {
url : "/api/missionInventoryUpdate.php?" + window . authz ,
contentType : "text/plain" ,
data : JSON . stringify ( {
RawUpgrades : [
{
ItemType : uniqueName ,
ItemCount : 1
}
]
} )
} ) . done ( function ( ) {
document . getElementById ( "mod-to-acquire" ) . value = "" ;
updateInventory ( ) ;
} ) ;
} ) ;
}
$ ( "#mod-to-acquire" ) . on ( "input" , ( ) => {
$ ( "#mod-to-acquire" ) . removeClass ( "is-invalid" ) ;
} ) ;
2024-06-15 00:38:12 +02:00
2025-01-15 05:20:30 +01:00
const uiConfigs = [ ... $ ( "#server-settings input[id]" ) ] . map ( x => x . id ) ;
2024-06-29 13:50:53 +02:00
2024-06-15 00:38:12 +02:00
function doChangeSettings ( ) {
2024-12-23 22:44:01 +01:00
fetch ( "/custom/config?" + window . authz )
2024-06-14 22:38:33 +00:00
. then ( response => response . json ( ) )
. then ( json => {
2024-06-29 13:50:53 +02:00
for ( const i of uiConfigs ) {
var x = document . getElementById ( i ) ;
2024-06-14 22:38:33 +00:00
if ( x != null ) {
2024-06-15 00:38:12 +02:00
if ( x . type == "checkbox" ) {
if ( x . checked === true ) {
2024-06-14 22:38:33 +00:00
json [ i ] = true ;
2024-06-15 00:38:12 +02:00
} else {
2024-06-14 22:38:33 +00:00
json [ i ] = false ;
2024-06-15 00:38:12 +02:00
}
} else if ( x . type == "number" ) {
2024-06-14 22:38:33 +00:00
json [ i ] = parseInt ( x . value ) ;
2024-06-15 00:38:12 +02:00
}
}
}
$ . post ( {
2024-12-23 22:44:01 +01:00
url : "/custom/config?" + window . authz ,
2024-06-15 00:38:12 +02:00
contentType : "text/plain" ,
data : JSON . stringify ( json , null , 2 )
2024-06-14 22:38:33 +00:00
} ) ;
} ) ;
}
2024-06-27 23:08:59 +02:00
// Cheats route
2024-06-30 13:13:26 +02:00
single . getRoute ( "/webui/cheats" ) . on ( "beforeload" , function ( ) {
2024-12-23 22:44:01 +01:00
let interval ;
interval = setInterval ( ( ) => {
if ( window . authz ) {
clearInterval ( interval ) ;
fetch ( "/custom/config?" + window . authz ) . then ( res => {
if ( res . status == 200 ) {
$ ( "#server-settings" ) . removeClass ( "d-none" ) ;
res . json ( ) . then ( json =>
Object . entries ( json ) . forEach ( entry => {
const [ key , value ] = entry ;
var x = document . getElementById ( ` ${ key } ` ) ;
if ( x != null ) {
if ( x . type == "checkbox" ) {
if ( value === true ) {
x . setAttribute ( "checked" , "checked" ) ;
}
} else if ( x . type == "number" ) {
x . setAttribute ( "value" , ` ${ value } ` ) ;
}
}
} )
) ;
} else {
$ ( "#server-settings-no-perms" ) . removeClass ( "d-none" ) ;
2024-06-30 13:13:26 +02:00
}
2024-12-23 22:44:01 +01:00
} ) ;
}
} , 10 ) ;
2024-06-30 13:13:26 +02:00
fetch ( "http://localhost:61558/ping" , { mode : "no-cors" } )
. then ( ( ) => {
$ ( "#client-cheats-ok" ) . removeClass ( "d-none" ) ;
$ ( "#client-cheats-nok" ) . addClass ( "d-none" ) ;
2024-06-27 23:08:59 +02:00
2024-06-30 13:13:26 +02:00
fetch ( "http://localhost:61558/skip_mission_start_timer" )
. then ( res => res . text ( ) )
. then ( res => {
document . getElementById ( "skip_mission_start_timer" ) . checked = res == "1" ;
} ) ;
document . getElementById ( "skip_mission_start_timer" ) . onchange = function ( ) {
fetch ( "http://localhost:61558/skip_mission_start_timer?" + this . checked ) ;
} ;
2024-06-27 23:08:59 +02:00
2024-06-30 13:13:26 +02:00
fetch ( "http://localhost:61558/fov_override" )
. then ( res => res . text ( ) )
. then ( res => {
document . getElementById ( "fov_override" ) . value = parseFloat ( res ) * 10000 ;
} ) ;
document . getElementById ( "fov_override" ) . oninput = function ( ) {
fetch ( "http://localhost:61558/fov_override?" + this . value ) ;
} ;
} )
. catch ( function ( ) {
$ ( "#client-cheats-nok" ) . removeClass ( "d-none" ) ;
$ ( "#client-cheats-ok" ) . addClass ( "d-none" ) ;
2024-06-27 23:08:59 +02:00
} ) ;
} ) ;
function doUnlockAllFocusSchools ( ) {
revalidateAuthz ( ( ) => {
$ . get ( "/api/inventory.php?" + window . authz + "&xpBasedLevelCapDisabled=1" ) . done ( async data => {
const missingFocusUpgrades = {
"/Lotus/Upgrades/Focus/Attack/AttackFocusAbility" : true ,
"/Lotus/Upgrades/Focus/Tactic/TacticFocusAbility" : true ,
"/Lotus/Upgrades/Focus/Ward/WardFocusAbility" : true ,
"/Lotus/Upgrades/Focus/Defense/DefenseFocusAbility" : true ,
"/Lotus/Upgrades/Focus/Power/PowerFocusAbility" : true
} ;
if ( data . FocusUpgrades ) {
for ( const focusUpgrade of data . FocusUpgrades ) {
if ( focusUpgrade . ItemType in missingFocusUpgrades ) {
delete missingFocusUpgrades [ focusUpgrade . ItemType ] ;
}
}
}
for ( const upgradeType of Object . keys ( missingFocusUpgrades ) ) {
await unlockFocusSchool ( upgradeType ) ;
}
if ( Object . keys ( missingFocusUpgrades ) . length == 0 ) {
alert ( "All focus schools are already unlocked." ) ;
} else {
alert (
"Unlocked " +
Object . keys ( missingFocusUpgrades ) . length +
" new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that."
) ;
}
} ) ;
} ) ;
}
function unlockFocusSchool ( upgradeType ) {
return new Promise ( resolve => {
// Deselect current FocusAbility so we will be able to unlock the way for free
$ . post ( {
url : "/api/focus.php?" + window . authz + "&op=5" ,
contentType : "text/plain" ,
data : "{}"
} ) . done ( function ( ) {
// Unlock the way now
$ . post ( {
url : "/api/focus.php?" + window . authz + "&op=2" ,
contentType : "text/plain" ,
data : JSON . stringify ( {
FocusType : upgradeType
} )
} ) . done ( function ( ) {
resolve ( ) ;
} ) ;
} ) ;
} ) ;
}
2024-06-30 13:13:26 +02:00
2025-01-05 12:26:26 +01:00
function doHelminthUnlockAll ( ) {
revalidateAuthz ( ( ) => {
$ . post ( "/api/infestedFoundry.php?" + window . authz + "&mode=custom_unlockall" ) ;
} ) ;
}
2024-06-30 13:13:26 +02:00
// Powersuit Route
single . getRoute ( "#powersuit-route" ) . on ( "beforeload" , function ( ) {
this . element . querySelector ( "h3" ) . textContent = "Loading..." ;
if ( window . didInitialInventoryUpdate ) {
updateInventory ( ) ;
}
} ) ;
function doPushArchonCrystalUpgrade ( ) {
const uniqueName = getKey ( document . querySelector ( "[list='datalist-archonCrystalUpgrades']" ) ) ;
if ( ! uniqueName ) {
$ ( "[list='datalist-archonCrystalUpgrades']" ) . addClass ( "is-invalid" ) . focus ( ) ;
return ;
}
revalidateAuthz ( ( ) => {
$ . get (
"/custom/pushArchonCrystalUpgrade?" +
window . authz +
"&oid=" +
single . getCurrentPath ( ) . substr ( 17 ) +
"&type=" +
uniqueName +
"&count=" +
$ ( "#archon-crystal-add-count" ) . val ( )
) . done ( function ( ) {
$ ( "[list='datalist-archonCrystalUpgrades']" ) . val ( "" ) ;
updateInventory ( ) ;
} ) ;
} ) ;
}
$ ( "[list='datalist-archonCrystalUpgrades']" ) . on ( "input" , ( ) => {
$ ( "[list='datalist-archonCrystalUpgrades']" ) . removeClass ( "is-invalid" ) ;
} ) ;
function doPopArchonCrystalUpgrade ( type ) {
revalidateAuthz ( ( ) => {
$ . get (
"/custom/popArchonCrystalUpgrade?" +
window . authz +
"&oid=" +
single . getCurrentPath ( ) . substr ( 17 ) +
"&type=" +
type
) . done ( function ( ) {
updateInventory ( ) ;
} ) ;
} ) ;
}