Compare commits
	
		
			1 Commits
		
	
	
		
			main
			...
			feat-playe
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d829c3ce33 | 
							
								
								
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -9,7 +9,6 @@
 | 
				
			|||||||
      "version": "0.1.0",
 | 
					      "version": "0.1.0",
 | 
				
			||||||
      "license": "GNU",
 | 
					      "license": "GNU",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "body-parser": "^2.2.0",
 | 
					 | 
				
			||||||
        "chokidar": "^4.0.3",
 | 
					        "chokidar": "^4.0.3",
 | 
				
			||||||
        "crc-32": "^1.2.2",
 | 
					        "crc-32": "^1.2.2",
 | 
				
			||||||
        "express": "^5",
 | 
					        "express": "^5",
 | 
				
			||||||
@ -38,7 +37,6 @@
 | 
				
			|||||||
        "node": ">=20.18.1"
 | 
					        "node": ">=20.18.1"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "optionalDependencies": {
 | 
					      "optionalDependencies": {
 | 
				
			||||||
        "@types/body-parser": "^1.19.6",
 | 
					 | 
				
			||||||
        "@types/express": "^5",
 | 
					        "@types/express": "^5",
 | 
				
			||||||
        "@types/morgan": "^1.9.9",
 | 
					        "@types/morgan": "^1.9.9",
 | 
				
			||||||
        "@types/websocket": "^1.0.10",
 | 
					        "@types/websocket": "^1.0.10",
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,6 @@
 | 
				
			|||||||
  "license": "GNU",
 | 
					  "license": "GNU",
 | 
				
			||||||
  "type": "module",
 | 
					  "type": "module",
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "body-parser": "^2.2.0",
 | 
					 | 
				
			||||||
    "chokidar": "^4.0.3",
 | 
					    "chokidar": "^4.0.3",
 | 
				
			||||||
    "crc-32": "^1.2.2",
 | 
					    "crc-32": "^1.2.2",
 | 
				
			||||||
    "express": "^5",
 | 
					    "express": "^5",
 | 
				
			||||||
@ -43,7 +42,6 @@
 | 
				
			|||||||
    "ws": "^8.18.2"
 | 
					    "ws": "^8.18.2"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "optionalDependencies": {
 | 
					  "optionalDependencies": {
 | 
				
			||||||
    "@types/body-parser": "^1.19.6",
 | 
					 | 
				
			||||||
    "@types/express": "^5",
 | 
					    "@types/express": "^5",
 | 
				
			||||||
    "@types/morgan": "^1.9.9",
 | 
					    "@types/morgan": "^1.9.9",
 | 
				
			||||||
    "@types/websocket": "^1.0.10",
 | 
					    "@types/websocket": "^1.0.10",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
import { fromDbOid, toMongoDate, version_compare } from "../../helpers/inventoryHelpers.ts";
 | 
					import { fromDbOid, version_compare } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import type { IKnifeResponse } from "../../helpers/nemesisHelpers.ts";
 | 
					import type { IKnifeResponse } from "../../helpers/nemesisHelpers.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    antivirusMods,
 | 
					    antivirusMods,
 | 
				
			||||||
@ -310,15 +310,6 @@ export const nemesisController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
        res.json({
 | 
					        res.json({
 | 
				
			||||||
            target: inventory.toJSON().Nemesis
 | 
					            target: inventory.toJSON().Nemesis
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    } else if ((req.query.mode as string) == "t") {
 | 
					 | 
				
			||||||
        const inventory = await getInventory(account._id.toString(), "LastNemesisAllySpawnTime");
 | 
					 | 
				
			||||||
        //const body = getJSONfromString<IUpdateAllySpawnTimeRequest>(String(req.body));
 | 
					 | 
				
			||||||
        const now = new Date(Math.trunc(Date.now() / 1000) * 1000);
 | 
					 | 
				
			||||||
        inventory.LastNemesisAllySpawnTime = now;
 | 
					 | 
				
			||||||
        await inventory.save();
 | 
					 | 
				
			||||||
        res.json({
 | 
					 | 
				
			||||||
            NewTime: toMongoDate(now)
 | 
					 | 
				
			||||||
        } satisfies IUpdateAllySpawnTimeResponse);
 | 
					 | 
				
			||||||
    } else if ((req.query.mode as string) == "d") {
 | 
					    } else if ((req.query.mode as string) == "d") {
 | 
				
			||||||
        const inventory = await getInventory(account._id.toString(), "NemesisHistory");
 | 
					        const inventory = await getInventory(account._id.toString(), "NemesisHistory");
 | 
				
			||||||
        const body = getJSONfromString<IRelinquishAdversariesRequest>(String(req.body));
 | 
					        const body = getJSONfromString<IRelinquishAdversariesRequest>(String(req.body));
 | 
				
			||||||
@ -471,11 +462,3 @@ const consumeModCharge = (
 | 
				
			|||||||
interface IRelinquishAdversariesRequest {
 | 
					interface IRelinquishAdversariesRequest {
 | 
				
			||||||
    nemesisFingerprints: (bigint | number)[];
 | 
					    nemesisFingerprints: (bigint | number)[];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// interface IUpdateAllySpawnTimeRequest {
 | 
					 | 
				
			||||||
//     LastSpawnTime: IMongoDate;
 | 
					 | 
				
			||||||
// }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
interface IUpdateAllySpawnTimeResponse {
 | 
					 | 
				
			||||||
    NewTime: IMongoDate;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1468,6 +1468,8 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
				
			|||||||
        nemesisHintProgressMultiplierGrineer: Number,
 | 
					        nemesisHintProgressMultiplierGrineer: Number,
 | 
				
			||||||
        nemesisHintProgressMultiplierCorpus: Number,
 | 
					        nemesisHintProgressMultiplierCorpus: Number,
 | 
				
			||||||
        nemesisExtraWeapon: Number,
 | 
					        nemesisExtraWeapon: Number,
 | 
				
			||||||
 | 
					        playerSkillGainsMultiplierSpace: Number,
 | 
				
			||||||
 | 
					        playerSkillGainsMultiplierDrifter: Number,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        SubscribedToEmails: { type: Number, default: 0 },
 | 
					        SubscribedToEmails: { type: Number, default: 0 },
 | 
				
			||||||
        SubscribedToEmailsPersonalized: { type: Number, default: 0 },
 | 
					        SubscribedToEmailsPersonalized: { type: Number, default: 0 },
 | 
				
			||||||
@ -1743,7 +1745,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
				
			|||||||
        NemesisAbandonedRewards: { type: [String], default: [] },
 | 
					        NemesisAbandonedRewards: { type: [String], default: [] },
 | 
				
			||||||
        Nemesis: nemesisSchema,
 | 
					        Nemesis: nemesisSchema,
 | 
				
			||||||
        NemesisHistory: { type: [nemesisSchema], default: undefined },
 | 
					        NemesisHistory: { type: [nemesisSchema], default: undefined },
 | 
				
			||||||
        LastNemesisAllySpawnTime: { type: Date, default: undefined },
 | 
					        //LastNemesisAllySpawnTime: Schema.Types.Mixed,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //TradingRulesConfirmed,ShowFriendInvNotifications(Option->Social)
 | 
					        //TradingRulesConfirmed,ShowFriendInvNotifications(Option->Social)
 | 
				
			||||||
        Settings: settingsSchema,
 | 
					        Settings: settingsSchema,
 | 
				
			||||||
@ -1864,9 +1866,6 @@ inventorySchema.set("toJSON", {
 | 
				
			|||||||
        if (inventoryDatabase.BlessingCooldown) {
 | 
					        if (inventoryDatabase.BlessingCooldown) {
 | 
				
			||||||
            inventoryResponse.BlessingCooldown = toMongoDate(inventoryDatabase.BlessingCooldown);
 | 
					            inventoryResponse.BlessingCooldown = toMongoDate(inventoryDatabase.BlessingCooldown);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (inventoryDatabase.LastNemesisAllySpawnTime) {
 | 
					 | 
				
			||||||
            inventoryResponse.LastNemesisAllySpawnTime = toMongoDate(inventoryDatabase.LastNemesisAllySpawnTime);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (inventoryDatabase.NextRefill) {
 | 
					        if (inventoryDatabase.NextRefill) {
 | 
				
			||||||
            inventoryResponse.NextRefill = toMongoDate(inventoryDatabase.NextRefill);
 | 
					            inventoryResponse.NextRefill = toMongoDate(inventoryDatabase.NextRefill);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -73,7 +73,6 @@ import type {
 | 
				
			|||||||
    ITailorShop,
 | 
					    ITailorShop,
 | 
				
			||||||
    ITailorShopDatabase
 | 
					    ITailorShopDatabase
 | 
				
			||||||
} from "../types/personalRoomsTypes.ts";
 | 
					} from "../types/personalRoomsTypes.ts";
 | 
				
			||||||
import { fromMongoDate } from "../helpers/inventoryHelpers.ts";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const convertDate = (value: IMongoDate): Date => {
 | 
					const convertDate = (value: IMongoDate): Date => {
 | 
				
			||||||
    return new Date(parseInt(value.$date.$numberLong));
 | 
					    return new Date(parseInt(value.$date.$numberLong));
 | 
				
			||||||
@ -327,15 +326,7 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<
 | 
				
			|||||||
        "GiftsRemaining",
 | 
					        "GiftsRemaining",
 | 
				
			||||||
        "ChallengesFixVersion",
 | 
					        "ChallengesFixVersion",
 | 
				
			||||||
        "Founder",
 | 
					        "Founder",
 | 
				
			||||||
        "Guide",
 | 
					        "Guide"
 | 
				
			||||||
        "BountyScore",
 | 
					 | 
				
			||||||
        "EntratiVaultCountLastPeriod",
 | 
					 | 
				
			||||||
        "EntratiLabConquestUnlocked",
 | 
					 | 
				
			||||||
        "EntratiLabConquestHardModeStatus",
 | 
					 | 
				
			||||||
        "EntratiLabConquestCacheScoreMission",
 | 
					 | 
				
			||||||
        "EchoesHexConquestUnlocked",
 | 
					 | 
				
			||||||
        "EchoesHexConquestHardModeStatus",
 | 
					 | 
				
			||||||
        "EchoesHexConquestCacheScoreMission"
 | 
					 | 
				
			||||||
    ] as const) {
 | 
					    ] as const) {
 | 
				
			||||||
        if (client[key] !== undefined) {
 | 
					        if (client[key] !== undefined) {
 | 
				
			||||||
            db[key] = client[key];
 | 
					            db[key] = client[key];
 | 
				
			||||||
@ -363,28 +354,12 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<
 | 
				
			|||||||
        "NodeIntrosCompleted",
 | 
					        "NodeIntrosCompleted",
 | 
				
			||||||
        "DeathMarks",
 | 
					        "DeathMarks",
 | 
				
			||||||
        "Wishlist",
 | 
					        "Wishlist",
 | 
				
			||||||
        "NemesisAbandonedRewards",
 | 
					        "NemesisAbandonedRewards"
 | 
				
			||||||
        "EntratiLabConquestActiveFrameVariants",
 | 
					 | 
				
			||||||
        "EchoesHexConquestActiveFrameVariants",
 | 
					 | 
				
			||||||
        "EchoesHexConquestActiveStickers"
 | 
					 | 
				
			||||||
    ] as const) {
 | 
					    ] as const) {
 | 
				
			||||||
        if (client[key] !== undefined) {
 | 
					        if (client[key] !== undefined) {
 | 
				
			||||||
            db[key] = client[key];
 | 
					            db[key] = client[key];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // IMongoDate
 | 
					 | 
				
			||||||
    for (const key of [
 | 
					 | 
				
			||||||
        "Created",
 | 
					 | 
				
			||||||
        "TrainingDate",
 | 
					 | 
				
			||||||
        "BlessingCooldown",
 | 
					 | 
				
			||||||
        "LastNemesisAllySpawnTime",
 | 
					 | 
				
			||||||
        "NextRefill",
 | 
					 | 
				
			||||||
        "EntratiVaultCountResetDate"
 | 
					 | 
				
			||||||
    ] as const) {
 | 
					 | 
				
			||||||
        if (client[key] !== undefined) {
 | 
					 | 
				
			||||||
            db[key] = fromMongoDate(client[key]);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // IRewardAtten[]
 | 
					    // IRewardAtten[]
 | 
				
			||||||
    for (const key of ["SortieRewardAttenuation", "SpecialItemRewardAttenuation"] as const) {
 | 
					    for (const key of ["SortieRewardAttenuation", "SpecialItemRewardAttenuation"] as const) {
 | 
				
			||||||
        if (client[key] !== undefined) {
 | 
					        if (client[key] !== undefined) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1489,13 +1489,7 @@ export const addSkin = (
 | 
				
			|||||||
    inventoryChanges: IInventoryChanges = {}
 | 
					    inventoryChanges: IInventoryChanges = {}
 | 
				
			||||||
): IInventoryChanges => {
 | 
					): IInventoryChanges => {
 | 
				
			||||||
    if (inventory.WeaponSkins.some(x => x.ItemType == typeName)) {
 | 
					    if (inventory.WeaponSkins.some(x => x.ItemType == typeName)) {
 | 
				
			||||||
        if (typeName == "/Lotus/Upgrades/Skins/Clan/BountyHunterBadgeItem") {
 | 
					        logger.debug(`refusing to add WeaponSkin ${typeName} because account already owns it`);
 | 
				
			||||||
            logger.debug(`account already owns stratos emblem, increasing bounty score instead`);
 | 
					 | 
				
			||||||
            inventory.BountyScore ??= 0;
 | 
					 | 
				
			||||||
            inventory.BountyScore += 1;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            logger.debug(`refusing to add WeaponSkin ${typeName} because account already owns it`);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        const index =
 | 
					        const index =
 | 
				
			||||||
            inventory.WeaponSkins.push({
 | 
					            inventory.WeaponSkins.push({
 | 
				
			||||||
 | 
				
			|||||||
@ -372,8 +372,10 @@ export const addMissionInventoryUpdates = async (
 | 
				
			|||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "PlayerSkillGains": {
 | 
					            case "PlayerSkillGains": {
 | 
				
			||||||
                inventory.PlayerSkills.LPP_SPACE += value.LPP_SPACE ?? 0;
 | 
					                inventory.PlayerSkills.LPP_SPACE +=
 | 
				
			||||||
                inventory.PlayerSkills.LPP_DRIFTER += value.LPP_DRIFTER ?? 0;
 | 
					                    (value.LPP_SPACE ?? 0) * (inventory.playerSkillGainsMultiplierSpace ?? 1);
 | 
				
			||||||
 | 
					                inventory.PlayerSkills.LPP_DRIFTER +=
 | 
				
			||||||
 | 
					                    (value.LPP_DRIFTER ?? 0) * (inventory.playerSkillGainsMultiplierDrifter ?? 1);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "CustomMarkers": {
 | 
					            case "CustomMarkers": {
 | 
				
			||||||
 | 
				
			|||||||
@ -61,6 +61,8 @@ export interface IAccountCheats {
 | 
				
			|||||||
    nemesisHintProgressMultiplierGrineer?: number;
 | 
					    nemesisHintProgressMultiplierGrineer?: number;
 | 
				
			||||||
    nemesisHintProgressMultiplierCorpus?: number;
 | 
					    nemesisHintProgressMultiplierCorpus?: number;
 | 
				
			||||||
    nemesisExtraWeapon?: number;
 | 
					    nemesisExtraWeapon?: number;
 | 
				
			||||||
 | 
					    playerSkillGainsMultiplierSpace?: number;
 | 
				
			||||||
 | 
					    playerSkillGainsMultiplierDrifter?: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IInventoryDatabase
 | 
					export interface IInventoryDatabase
 | 
				
			||||||
@ -92,7 +94,6 @@ export interface IInventoryDatabase
 | 
				
			|||||||
            | "NextRefill"
 | 
					            | "NextRefill"
 | 
				
			||||||
            | "Nemesis"
 | 
					            | "Nemesis"
 | 
				
			||||||
            | "NemesisHistory"
 | 
					            | "NemesisHistory"
 | 
				
			||||||
            | "LastNemesisAllySpawnTime"
 | 
					 | 
				
			||||||
            | "EntratiVaultCountResetDate"
 | 
					            | "EntratiVaultCountResetDate"
 | 
				
			||||||
            | "BrandedSuits"
 | 
					            | "BrandedSuits"
 | 
				
			||||||
            | "LockedWeaponGroup"
 | 
					            | "LockedWeaponGroup"
 | 
				
			||||||
@ -137,7 +138,6 @@ export interface IInventoryDatabase
 | 
				
			|||||||
    NextRefill?: Date;
 | 
					    NextRefill?: Date;
 | 
				
			||||||
    Nemesis?: INemesisDatabase;
 | 
					    Nemesis?: INemesisDatabase;
 | 
				
			||||||
    NemesisHistory?: INemesisBaseDatabase[];
 | 
					    NemesisHistory?: INemesisBaseDatabase[];
 | 
				
			||||||
    LastNemesisAllySpawnTime?: Date;
 | 
					 | 
				
			||||||
    EntratiVaultCountResetDate?: Date;
 | 
					    EntratiVaultCountResetDate?: Date;
 | 
				
			||||||
    BrandedSuits?: Types.ObjectId[];
 | 
					    BrandedSuits?: Types.ObjectId[];
 | 
				
			||||||
    LockedWeaponGroup?: ILockedWeaponGroupDatabase;
 | 
					    LockedWeaponGroup?: ILockedWeaponGroupDatabase;
 | 
				
			||||||
@ -362,7 +362,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
 | 
				
			|||||||
    ThemeStyle: string;
 | 
					    ThemeStyle: string;
 | 
				
			||||||
    ThemeBackground: string;
 | 
					    ThemeBackground: string;
 | 
				
			||||||
    ThemeSounds: string;
 | 
					    ThemeSounds: string;
 | 
				
			||||||
    BountyScore?: number;
 | 
					    BountyScore: number;
 | 
				
			||||||
    //ChallengeInstanceStates: IChallengeInstanceState[];
 | 
					    //ChallengeInstanceStates: IChallengeInstanceState[];
 | 
				
			||||||
    LoginMilestoneRewards: string[];
 | 
					    LoginMilestoneRewards: string[];
 | 
				
			||||||
    RecentVendorPurchases?: IRecentVendorPurchaseClient[];
 | 
					    RecentVendorPurchases?: IRecentVendorPurchaseClient[];
 | 
				
			||||||
@ -374,7 +374,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
 | 
				
			|||||||
    //InvasionChainProgress: IInvasionChainProgress[];
 | 
					    //InvasionChainProgress: IInvasionChainProgress[];
 | 
				
			||||||
    Nemesis?: INemesisClient;
 | 
					    Nemesis?: INemesisClient;
 | 
				
			||||||
    NemesisHistory?: INemesisBaseClient[];
 | 
					    NemesisHistory?: INemesisBaseClient[];
 | 
				
			||||||
    LastNemesisAllySpawnTime?: IMongoDate;
 | 
					    //LastNemesisAllySpawnTime?: IMongoDate;
 | 
				
			||||||
    Settings?: ISettings;
 | 
					    Settings?: ISettings;
 | 
				
			||||||
    PersonalTechProjects: IPersonalTechProjectClient[];
 | 
					    PersonalTechProjects: IPersonalTechProjectClient[];
 | 
				
			||||||
    PlayerSkills: IPlayerSkills;
 | 
					    PlayerSkills: IPlayerSkills;
 | 
				
			||||||
 | 
				
			|||||||
@ -1057,6 +1057,20 @@
 | 
				
			|||||||
                                        <button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
 | 
					                                        <button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
 | 
				
			||||||
                                    </div>
 | 
					                                    </div>
 | 
				
			||||||
                                </form>
 | 
					                                </form>
 | 
				
			||||||
 | 
					                                <form class="form-group mt-2">
 | 
				
			||||||
 | 
					                                    <label class="form-label" for="playerSkillGainsMultiplierSpace" data-loc="cheats_playerSkillGainsMultiplierSpace"></label>
 | 
				
			||||||
 | 
					                                    <div class="input-group">
 | 
				
			||||||
 | 
					                                        <input class="form-control" id="playerSkillGainsMultiplierSpace" type="number" min="1" max="65535" data-default="1" />
 | 
				
			||||||
 | 
					                                        <button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                </form>
 | 
				
			||||||
 | 
					                                <form class="form-group mt-2">
 | 
				
			||||||
 | 
					                                    <label class="form-label" for="playerSkillGainsMultiplierDrifter" data-loc="cheats_playerSkillGainsMultiplierDrifter"></label>
 | 
				
			||||||
 | 
					                                    <div class="input-group">
 | 
				
			||||||
 | 
					                                        <input class="form-control" id="playerSkillGainsMultiplierDrifter" type="number" min="1" max="65535" data-default="1" />
 | 
				
			||||||
 | 
					                                        <button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                </form>
 | 
				
			||||||
                                <div class="mt-2 mb-2 d-flex flex-wrap gap-2">
 | 
					                                <div class="mt-2 mb-2 d-flex flex-wrap gap-2">
 | 
				
			||||||
                                    <button class="btn btn-primary" onclick="debounce(doUnlockAllShipFeatures);" data-loc="cheats_unlockAllShipFeatures"></button>
 | 
					                                    <button class="btn btn-primary" onclick="debounce(doUnlockAllShipFeatures);" data-loc="cheats_unlockAllShipFeatures"></button>
 | 
				
			||||||
                                    <button class="btn btn-primary" onclick="debounce(unlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
 | 
					                                    <button class="btn btn-primary" onclick="debounce(unlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
 | 
				
			||||||
 | 
				
			|||||||
@ -2844,8 +2844,8 @@ function removeCountItems(uniqueName, count) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function addItemByItemType() {
 | 
					function addItemByItemType() {
 | 
				
			||||||
    const ItemType = document.getElementById("typeName-type").value;
 | 
					    const ItemType = document.getElementById("typeName-type").value;
 | 
				
			||||||
    // Must start with "/Lotus/", contain only letters A–Z, digits 0–9, no "//", and not end with "/"
 | 
					    // Must start with "/Lotus/", contain only A–Z letters, no "//", and not end with "/"
 | 
				
			||||||
    if (!ItemType || !/^\/Lotus\/(?:[A-Za-z0-9]+(?:\/[A-Za-z0-9]+)*)$/.test(ItemType)) {
 | 
					    if (!ItemType || !/^\/Lotus\/(?:[A-Za-z]+(?:\/[A-Za-z]+)*)$/.test(ItemType)) {
 | 
				
			||||||
        $("#typeName-type").addClass("is-invalid").focus();
 | 
					        $("#typeName-type").addClass("is-invalid").focus();
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -263,6 +263,8 @@ dict = {
 | 
				
			|||||||
    cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
 | 
					    cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
 | 
				
			||||||
    cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
 | 
					    cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
 | 
				
			||||||
    cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
 | 
					    cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierSpace: `[UNTRANSLATED] Intrinsics Gains Multiplier (Space)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierDrifter: `[UNTRANSLATED] Intrinsics Gains Multiplier (Drifter)`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    worldState: `Weltstatus`,
 | 
					    worldState: `Weltstatus`,
 | 
				
			||||||
    worldState_creditBoost: `Event Booster: Credit`,
 | 
					    worldState_creditBoost: `Event Booster: Credit`,
 | 
				
			||||||
 | 
				
			|||||||
@ -262,6 +262,8 @@ dict = {
 | 
				
			|||||||
    cheats_nemesisHintProgressMultiplierGrineer: `Hint Progress Multiplier (Grineer)`,
 | 
					    cheats_nemesisHintProgressMultiplierGrineer: `Hint Progress Multiplier (Grineer)`,
 | 
				
			||||||
    cheats_nemesisHintProgressMultiplierCorpus: `Hint Progress Multiplier (Corpus)`,
 | 
					    cheats_nemesisHintProgressMultiplierCorpus: `Hint Progress Multiplier (Corpus)`,
 | 
				
			||||||
    cheats_nemesisExtraWeapon: `Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
 | 
					    cheats_nemesisExtraWeapon: `Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierSpace: `Intrinsics Gains Multiplier (Space)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierDrifter: `Intrinsics Gains Multiplier (Drifter)`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    worldState: `World State`,
 | 
					    worldState: `World State`,
 | 
				
			||||||
    worldState_creditBoost: `Credit Boost`,
 | 
					    worldState_creditBoost: `Credit Boost`,
 | 
				
			||||||
 | 
				
			|||||||
@ -263,6 +263,8 @@ dict = {
 | 
				
			|||||||
    cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
 | 
					    cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
 | 
				
			||||||
    cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
 | 
					    cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
 | 
				
			||||||
    cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
 | 
					    cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierSpace: `[UNTRANSLATED] Intrinsics Gains Multiplier (Space)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierDrifter: `[UNTRANSLATED] Intrinsics Gains Multiplier (Drifter)`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    worldState: `Estado del mundo`,
 | 
					    worldState: `Estado del mundo`,
 | 
				
			||||||
    worldState_creditBoost: `Potenciador de Créditos`,
 | 
					    worldState_creditBoost: `Potenciador de Créditos`,
 | 
				
			||||||
 | 
				
			|||||||
@ -263,6 +263,8 @@ dict = {
 | 
				
			|||||||
    cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
 | 
					    cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
 | 
				
			||||||
    cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
 | 
					    cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
 | 
				
			||||||
    cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
 | 
					    cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierSpace: `[UNTRANSLATED] Intrinsics Gains Multiplier (Space)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierDrifter: `[UNTRANSLATED] Intrinsics Gains Multiplier (Drifter)`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    worldState: `Carte Solaire`,
 | 
					    worldState: `Carte Solaire`,
 | 
				
			||||||
    worldState_creditBoost: `Booster de Crédit`,
 | 
					    worldState_creditBoost: `Booster de Crédit`,
 | 
				
			||||||
 | 
				
			|||||||
@ -263,6 +263,8 @@ dict = {
 | 
				
			|||||||
    cheats_nemesisHintProgressMultiplierGrineer: `Мультипликатор прогресса подсказки (Гринир)`,
 | 
					    cheats_nemesisHintProgressMultiplierGrineer: `Мультипликатор прогресса подсказки (Гринир)`,
 | 
				
			||||||
    cheats_nemesisHintProgressMultiplierCorpus: `Мультипликатор прогресса подсказки (Корпус)`,
 | 
					    cheats_nemesisHintProgressMultiplierCorpus: `Мультипликатор прогресса подсказки (Корпус)`,
 | 
				
			||||||
    cheats_nemesisExtraWeapon: `Дополнительное оружие/активный Кардиомиоцит за победу над Противником (0 для отключения)`,
 | 
					    cheats_nemesisExtraWeapon: `Дополнительное оружие/активный Кардиомиоцит за победу над Противником (0 для отключения)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierSpace: `[UNTRANSLATED] Intrinsics Gains Multiplier (Space)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierDrifter: `[UNTRANSLATED] Intrinsics Gains Multiplier (Drifter)`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    worldState: `Состояние мира`,
 | 
					    worldState: `Состояние мира`,
 | 
				
			||||||
    worldState_creditBoost: `Глобальный бустер Кредитов`,
 | 
					    worldState_creditBoost: `Глобальный бустер Кредитов`,
 | 
				
			||||||
 | 
				
			|||||||
@ -263,6 +263,8 @@ dict = {
 | 
				
			|||||||
    cheats_nemesisHintProgressMultiplierGrineer: `Множник прогресу підсказки (Ґрінери)`,
 | 
					    cheats_nemesisHintProgressMultiplierGrineer: `Множник прогресу підсказки (Ґрінери)`,
 | 
				
			||||||
    cheats_nemesisHintProgressMultiplierCorpus: `Множник прогресу підсказки (Корпус)`,
 | 
					    cheats_nemesisHintProgressMultiplierCorpus: `Множник прогресу підсказки (Корпус)`,
 | 
				
			||||||
    cheats_nemesisExtraWeapon: `Додаткова зброя/Жива сердцевина за перемогу над Недругом (0 для вимкнення)`,
 | 
					    cheats_nemesisExtraWeapon: `Додаткова зброя/Жива сердцевина за перемогу над Недругом (0 для вимкнення)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierSpace: `[UNTRANSLATED] Intrinsics Gains Multiplier (Space)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierDrifter: `[UNTRANSLATED] Intrinsics Gains Multiplier (Drifter)`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    worldState: `Стан світу`,
 | 
					    worldState: `Стан світу`,
 | 
				
			||||||
    worldState_creditBoost: `Глобальне посилення Кредитів`,
 | 
					    worldState_creditBoost: `Глобальне посилення Кредитів`,
 | 
				
			||||||
 | 
				
			|||||||
@ -263,6 +263,8 @@ dict = {
 | 
				
			|||||||
    cheats_nemesisHintProgressMultiplierGrineer: `解密进度倍率 (Grineer)`,
 | 
					    cheats_nemesisHintProgressMultiplierGrineer: `解密进度倍率 (Grineer)`,
 | 
				
			||||||
    cheats_nemesisHintProgressMultiplierCorpus: `解密进度倍率 (Corpus)`,
 | 
					    cheats_nemesisHintProgressMultiplierCorpus: `解密进度倍率 (Corpus)`,
 | 
				
			||||||
    cheats_nemesisExtraWeapon: `额外玄骸武器/代币 (0为禁用)`,
 | 
					    cheats_nemesisExtraWeapon: `额外玄骸武器/代币 (0为禁用)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierSpace: `內源之力获取倍率 (九重天)`,
 | 
				
			||||||
 | 
					    cheats_playerSkillGainsMultiplierDrifter: `內源之力获取倍率 (漂泊者)`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    worldState: `世界状态配置`,
 | 
					    worldState: `世界状态配置`,
 | 
				
			||||||
    worldState_creditBoost: `现金加成`,
 | 
					    worldState_creditBoost: `现金加成`,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user