Add Luo Castle main gate chapter
This commit is contained in:
@@ -12,12 +12,12 @@ try {
|
||||
browser = await chromium.launch({ headless: true });
|
||||
const page = await browser.newPage({ viewport: { width: 1280, height: 720 } });
|
||||
|
||||
await page.goto(targetUrl, { waitUntil: 'networkidle' });
|
||||
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
|
||||
await page.evaluate(() => window.localStorage.clear());
|
||||
await page.reload({ waitUntil: 'networkidle' });
|
||||
await page.waitForSelector('canvas');
|
||||
await page.waitForFunction(() => window.__HEROS_GAME__ !== undefined);
|
||||
await page.waitForFunction(() => window.__HEROS_DEBUG__ !== undefined);
|
||||
await page.reload({ waitUntil: 'domcontentloaded' });
|
||||
await page.waitForFunction(() => document.querySelector('canvas') !== null, undefined, { timeout: 90000 });
|
||||
await page.waitForFunction(() => window.__HEROS_GAME__ !== undefined, undefined, { timeout: 90000 });
|
||||
await page.waitForFunction(() => window.__HEROS_DEBUG__ !== undefined, undefined, { timeout: 90000 });
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
const debugBeforeBattle = await page.evaluate(() => window.__HEROS_DEBUG__?.activeScenes() ?? []);
|
||||
@@ -1736,7 +1736,7 @@ try {
|
||||
if (
|
||||
progressTabState?.activeTab !== 'progress' ||
|
||||
progressTabState.campaignProgress?.completedKnown !== 17 ||
|
||||
progressTabState.campaignProgress?.totalKnown !== 30 ||
|
||||
progressTabState.campaignProgress?.totalKnown !== 31 ||
|
||||
progressTabState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
progressTabState.campaignProgress?.latestBattleTitle !== '융중 방문로' ||
|
||||
progressTabState.campaignProgress?.nextBattleTitle !== '박망파 매복전'
|
||||
@@ -1888,7 +1888,7 @@ try {
|
||||
if (
|
||||
postBowangProgressState?.activeTab !== 'progress' ||
|
||||
postBowangProgressState.campaignProgress?.completedKnown !== 18 ||
|
||||
postBowangProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postBowangProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postBowangProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
postBowangProgressState.campaignProgress?.latestBattleTitle !== '박망파 매복전' ||
|
||||
postBowangProgressState.campaignProgress?.nextBattleTitle !== '장판파 피난로'
|
||||
@@ -2026,7 +2026,7 @@ try {
|
||||
if (
|
||||
postChangbanProgressState?.activeTab !== 'progress' ||
|
||||
postChangbanProgressState.campaignProgress?.completedKnown !== 19 ||
|
||||
postChangbanProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postChangbanProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postChangbanProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
postChangbanProgressState.campaignProgress?.latestBattleTitle !== '장판파 피난로' ||
|
||||
postChangbanProgressState.campaignProgress?.nextBattleTitle !== '강동 사절로'
|
||||
@@ -2164,7 +2164,7 @@ try {
|
||||
if (
|
||||
postJiangdongProgressState?.activeTab !== 'progress' ||
|
||||
postJiangdongProgressState.campaignProgress?.completedKnown !== 20 ||
|
||||
postJiangdongProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postJiangdongProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postJiangdongProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
postJiangdongProgressState.campaignProgress?.latestBattleTitle !== '강동 사절로' ||
|
||||
postJiangdongProgressState.campaignProgress?.nextBattleTitle !== '적벽 전초전'
|
||||
@@ -2304,7 +2304,7 @@ try {
|
||||
if (
|
||||
postRedCliffsProgressState?.activeTab !== 'progress' ||
|
||||
postRedCliffsProgressState.campaignProgress?.completedKnown !== 21 ||
|
||||
postRedCliffsProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postRedCliffsProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postRedCliffsProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
postRedCliffsProgressState.campaignProgress?.latestBattleTitle !== '적벽 전초전' ||
|
||||
postRedCliffsProgressState.campaignProgress?.nextBattleTitle !== '적벽 화공전'
|
||||
@@ -2444,7 +2444,7 @@ try {
|
||||
if (
|
||||
postFireAttackProgressState?.activeTab !== 'progress' ||
|
||||
postFireAttackProgressState.campaignProgress?.completedKnown !== 22 ||
|
||||
postFireAttackProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postFireAttackProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postFireAttackProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postFireAttackProgressState.campaignProgress?.latestBattleTitle !== '적벽 화공전' ||
|
||||
postFireAttackProgressState.campaignProgress?.nextBattleTitle !== '형주 남부 진입전'
|
||||
@@ -2587,7 +2587,7 @@ try {
|
||||
if (
|
||||
postJingzhouProgressState?.activeTab !== 'progress' ||
|
||||
postJingzhouProgressState.campaignProgress?.completedKnown !== 23 ||
|
||||
postJingzhouProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postJingzhouProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postJingzhouProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postJingzhouProgressState.campaignProgress?.latestBattleTitle !== '형주 남부 진입전' ||
|
||||
postJingzhouProgressState.campaignProgress?.nextBattleTitle !== '계양 설득전'
|
||||
@@ -2729,7 +2729,7 @@ try {
|
||||
if (
|
||||
postGuiyangProgressState?.activeTab !== 'progress' ||
|
||||
postGuiyangProgressState.campaignProgress?.completedKnown !== 24 ||
|
||||
postGuiyangProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postGuiyangProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postGuiyangProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postGuiyangProgressState.campaignProgress?.latestBattleTitle !== '계양 설득전' ||
|
||||
postGuiyangProgressState.campaignProgress?.nextBattleTitle !== '무릉 산길 확보전'
|
||||
@@ -2872,7 +2872,7 @@ try {
|
||||
if (
|
||||
postWulingProgressState?.activeTab !== 'progress' ||
|
||||
postWulingProgressState.campaignProgress?.completedKnown !== 25 ||
|
||||
postWulingProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postWulingProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postWulingProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postWulingProgressState.campaignProgress?.latestBattleTitle !== '무릉 산길 확보전' ||
|
||||
postWulingProgressState.campaignProgress?.nextBattleTitle !== '장사 노장 대면전'
|
||||
@@ -3021,7 +3021,7 @@ try {
|
||||
if (
|
||||
postChangshaProgressState?.activeTab !== 'progress' ||
|
||||
postChangshaProgressState.campaignProgress?.completedKnown !== 26 ||
|
||||
postChangshaProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postChangshaProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postChangshaProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postChangshaProgressState.campaignProgress?.latestBattleTitle !== '장사 노장 대면전' ||
|
||||
postChangshaProgressState.campaignProgress?.nextBattleTitle !== '익주 원군로'
|
||||
@@ -3166,7 +3166,7 @@ try {
|
||||
if (
|
||||
postYizhouProgressState?.activeTab !== 'progress' ||
|
||||
postYizhouProgressState.campaignProgress?.completedKnown !== 27 ||
|
||||
postYizhouProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postYizhouProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postYizhouProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postYizhouProgressState.campaignProgress?.latestBattleTitle !== '익주 원군로' ||
|
||||
postYizhouProgressState.campaignProgress?.nextBattleTitle !== '부수관 진입전'
|
||||
@@ -3313,7 +3313,7 @@ try {
|
||||
if (
|
||||
postFuPassProgressState?.activeTab !== 'progress' ||
|
||||
postFuPassProgressState.campaignProgress?.completedKnown !== 28 ||
|
||||
postFuPassProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postFuPassProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postFuPassProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postFuPassProgressState.campaignProgress?.latestBattleTitle !== '부수관 진입전' ||
|
||||
postFuPassProgressState.campaignProgress?.nextBattleTitle !== '낙성 외곽전'
|
||||
@@ -3462,7 +3462,7 @@ try {
|
||||
if (
|
||||
postLuoProgressState?.activeTab !== 'progress' ||
|
||||
postLuoProgressState.campaignProgress?.completedKnown !== 29 ||
|
||||
postLuoProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postLuoProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postLuoProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postLuoProgressState.campaignProgress?.latestBattleTitle !== '낙성 외곽전' ||
|
||||
postLuoProgressState.campaignProgress?.nextBattleTitle !== '낙봉파 매복전'
|
||||
@@ -3608,27 +3608,186 @@ try {
|
||||
if (
|
||||
postLuofengProgressState?.activeTab !== 'progress' ||
|
||||
postLuofengProgressState.campaignProgress?.completedKnown !== 30 ||
|
||||
postLuofengProgressState.campaignProgress?.totalKnown !== 30 ||
|
||||
postLuofengProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postLuofengProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postLuofengProgressState.campaignProgress?.latestBattleTitle !== '낙봉파 매복전' ||
|
||||
postLuofengProgressState.campaignProgress?.nextBattleTitle !== '준비 중'
|
||||
postLuofengProgressState.campaignProgress?.nextBattleTitle !== '낙성 본성 공략'
|
||||
) {
|
||||
throw new Error(`Expected post-Luofeng progress tab to complete Luofeng and pause before Luo Castle proper: ${JSON.stringify(postLuofengProgressState?.campaignProgress)}`);
|
||||
throw new Error(`Expected post-Luofeng progress tab to complete Luofeng and open Luo Castle main gate: ${JSON.stringify(postLuofengProgressState?.campaignProgress)}`);
|
||||
}
|
||||
await page.screenshot({ path: 'dist/verification-post-luofeng-progress.png', fullPage: true });
|
||||
|
||||
await page.evaluate(() => window.__HEROS_GAME__?.scene.start('TitleScene'));
|
||||
await page.mouse.click(1120, 38);
|
||||
await page.waitForTimeout(180);
|
||||
const luoMainSortieState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (
|
||||
!luoMainSortieState?.sortieVisible ||
|
||||
!luoMainSortieState.sortiePlan?.objectiveLine?.includes('낙성 본성 공략') ||
|
||||
!luoMainSortieState.sortieRoster?.some((unit) => unit.id === 'pang-tong' && unit.recruited && unit.recommended) ||
|
||||
!luoMainSortieState.sortieRoster?.some((unit) => unit.id === 'fa-zheng' && unit.recruited && unit.recommended) ||
|
||||
!luoMainSortieState.sortieRoster?.some((unit) => unit.id === 'wu-yi' && unit.recruited && unit.recommended) ||
|
||||
!luoMainSortieState.sortieRoster?.some((unit) => unit.id === 'huang-zhong' && unit.recruited && unit.recommended) ||
|
||||
!luoMainSortieState.sortieRoster?.some((unit) => unit.id === 'zhang-fei' && unit.recommended) ||
|
||||
luoMainSortieState.sortieRoster?.some((unit) => unit.id === 'yan-yan') ||
|
||||
luoMainSortieState.sortieRoster?.length < 16 ||
|
||||
luoMainSortieState.sortiePlan?.maxCount !== 6
|
||||
) {
|
||||
throw new Error(`Expected Luofeng camp sortie prep to target Luo Castle main gate with Pang Tong, Fa Zheng, Wu Yi, Huang Zhong, and Zhang Fei recommended, before Yan Yan joins: ${JSON.stringify(luoMainSortieState)}`);
|
||||
}
|
||||
assertSortieTacticalRoster(luoMainSortieState, [
|
||||
'liu-bei',
|
||||
'guan-yu',
|
||||
'zhang-fei',
|
||||
'jian-yong',
|
||||
'mi-zhu',
|
||||
'sun-qian',
|
||||
'zhao-yun',
|
||||
'zhuge-liang',
|
||||
'ma-liang',
|
||||
'yi-ji',
|
||||
'gong-zhi',
|
||||
'huang-zhong',
|
||||
'wei-yan',
|
||||
'pang-tong',
|
||||
'fa-zheng',
|
||||
'wu-yi'
|
||||
]);
|
||||
|
||||
const luoMainPriorityUnits = ['pang-tong', 'fa-zheng', 'wu-yi', 'huang-zhong', 'zhang-fei'];
|
||||
for (const unitId of luoMainPriorityUnits) {
|
||||
const currentSortieState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (!currentSortieState.sortieRoster?.some((unit) => unit.id === unitId && unit.selected)) {
|
||||
const removable = currentSortieState.sortieRoster?.find(
|
||||
(unit) => unit.selected && unit.id !== 'liu-bei' && !luoMainPriorityUnits.includes(unit.id)
|
||||
);
|
||||
if (removable) {
|
||||
await clickSortieRosterUnit(page, removable.id);
|
||||
}
|
||||
await clickSortieRosterUnit(page, unitId);
|
||||
}
|
||||
}
|
||||
|
||||
const luoMainSortieReadyState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (
|
||||
!luoMainPriorityUnits.every((unitId) =>
|
||||
luoMainSortieReadyState.sortieRoster?.some((unit) => unit.id === unitId && unit.selected)
|
||||
) ||
|
||||
luoMainSortieReadyState.sortiePlan?.selectedCount !== 6 ||
|
||||
luoMainSortieReadyState.sortiePlan?.recommendedSelectedCount < 6
|
||||
) {
|
||||
throw new Error(`Expected Luo Castle main sortie to deploy Pang Tong, Fa Zheng, Wu Yi, Huang Zhong, and Zhang Fei while preserving six-officer pressure: ${JSON.stringify(luoMainSortieReadyState)}`);
|
||||
}
|
||||
await page.screenshot({ path: 'dist/verification-luo-main-sortie.png', fullPage: true });
|
||||
|
||||
await page.mouse.click(1068, 646);
|
||||
await page.waitForFunction(() => {
|
||||
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
|
||||
return activeScenes.includes('TitleScene');
|
||||
return activeScenes.includes('StoryScene');
|
||||
});
|
||||
await page.screenshot({ path: 'dist/verification-luo-main-story.png', fullPage: true });
|
||||
|
||||
for (let i = 0; i < 50; i += 1) {
|
||||
const enteredThirtyFirstBattle = await page.evaluate(() => {
|
||||
const state = window.__HEROS_DEBUG__?.battle();
|
||||
return state?.scene === 'BattleScene' && state?.battleId === 'thirty-first-battle-luo-main-gate';
|
||||
});
|
||||
if (enteredThirtyFirstBattle) {
|
||||
break;
|
||||
}
|
||||
await page.keyboard.press('Space');
|
||||
await page.waitForTimeout(320);
|
||||
}
|
||||
await page.waitForFunction(() => {
|
||||
const state = window.__HEROS_DEBUG__?.battle();
|
||||
return state?.scene === 'BattleScene' && state?.battleId === 'thirty-first-battle-luo-main-gate' && state?.battleOutcome === null && state?.phase === 'idle';
|
||||
});
|
||||
await page.screenshot({ path: 'dist/verification-thirty-first-battle.png', fullPage: true });
|
||||
|
||||
const thirtyFirstBattleState = await page.evaluate(() => window.__HEROS_DEBUG__?.battle());
|
||||
const thirtyFirstEnemies = thirtyFirstBattleState.units.filter((unit) => unit.faction === 'enemy');
|
||||
const thirtyFirstAllies = thirtyFirstBattleState.units.filter((unit) => unit.faction === 'ally');
|
||||
const thirtyFirstEnemyBehaviors = new Set(thirtyFirstEnemies.map((unit) => unit.ai));
|
||||
if (
|
||||
thirtyFirstBattleState.camera?.mapWidth !== 62 ||
|
||||
thirtyFirstBattleState.camera?.mapHeight !== 44 ||
|
||||
thirtyFirstBattleState.victoryConditionLabel !== '장임 본성 격파' ||
|
||||
thirtyFirstEnemies.length < 25 ||
|
||||
!thirtyFirstEnemyBehaviors.has('aggressive') ||
|
||||
!thirtyFirstEnemyBehaviors.has('guard') ||
|
||||
!thirtyFirstEnemyBehaviors.has('hold') ||
|
||||
!thirtyFirstEnemies.some((unit) => unit.id === 'luo-main-leader-zhang-ren') ||
|
||||
!thirtyFirstEnemies.some((unit) => unit.id === 'luo-main-veteran-yan-yan') ||
|
||||
!thirtyFirstAllies.some((unit) => unit.id === 'pang-tong') ||
|
||||
!thirtyFirstAllies.some((unit) => unit.id === 'fa-zheng') ||
|
||||
!thirtyFirstAllies.some((unit) => unit.id === 'wu-yi') ||
|
||||
!thirtyFirstAllies.some((unit) => unit.id === 'huang-zhong') ||
|
||||
!thirtyFirstAllies.some((unit) => unit.id === 'zhang-fei') ||
|
||||
thirtyFirstAllies.some((unit) => unit.id === 'yan-yan')
|
||||
) {
|
||||
throw new Error(`Expected thirty-first battle to use Luo Castle main map, Zhang Ren objective, Yan Yan enemy officer, selected allied officers, and mixed AI: ${JSON.stringify(thirtyFirstBattleState)}`);
|
||||
}
|
||||
|
||||
await page.evaluate(() => window.__HEROS_DEBUG__?.forceBattleOutcome('victory'));
|
||||
await page.waitForFunction(() => {
|
||||
const state = window.__HEROS_DEBUG__?.battle();
|
||||
return state?.battleOutcome === 'victory' && state?.phase === 'resolved' && state?.resultVisible === true;
|
||||
});
|
||||
|
||||
await page.mouse.click(738, 642);
|
||||
await page.waitForFunction(() => {
|
||||
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
|
||||
return activeScenes.includes('CampScene');
|
||||
});
|
||||
|
||||
const thirtyFirstCampState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (
|
||||
thirtyFirstCampState?.campBattleId !== 'thirty-first-battle-luo-main-gate' ||
|
||||
thirtyFirstCampState.campTitle !== '낙성 본성 공략 후 군영' ||
|
||||
thirtyFirstCampState.availableDialogueIds?.length !== 3 ||
|
||||
!thirtyFirstCampState.availableDialogueIds.every((id) => id.endsWith('luomain')) ||
|
||||
thirtyFirstCampState.availableVisitIds?.length !== 2 ||
|
||||
!thirtyFirstCampState.campaign?.roster?.some((unit) => unit.id === 'yan-yan') ||
|
||||
!thirtyFirstCampState.sortieRoster?.some((unit) => unit.id === 'yan-yan' && unit.recruited) ||
|
||||
thirtyFirstCampState.rosterCollection?.total < 17
|
||||
) {
|
||||
throw new Error(`Expected thirty-first camp to recruit Yan Yan and expose Luo main dialogue/visit sets: ${JSON.stringify(thirtyFirstCampState)}`);
|
||||
}
|
||||
await page.screenshot({ path: 'dist/verification-luo-main-camp.png', fullPage: true });
|
||||
|
||||
await page.mouse.click(966, 38);
|
||||
await page.waitForTimeout(180);
|
||||
const postLuoMainProgressState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (
|
||||
postLuoMainProgressState?.activeTab !== 'progress' ||
|
||||
postLuoMainProgressState.campaignProgress?.completedKnown !== 31 ||
|
||||
postLuoMainProgressState.campaignProgress?.totalKnown !== 31 ||
|
||||
postLuoMainProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postLuoMainProgressState.campaignProgress?.latestBattleTitle !== '낙성 본성 공략' ||
|
||||
postLuoMainProgressState.campaignProgress?.nextBattleTitle !== '준비 중'
|
||||
) {
|
||||
throw new Error(`Expected post-Luo-main progress tab to complete Luo Castle proper and pause before Chengdu pressure: ${JSON.stringify(postLuoMainProgressState?.campaignProgress)}`);
|
||||
}
|
||||
await page.screenshot({ path: 'dist/verification-post-luo-main-progress.png', fullPage: true });
|
||||
|
||||
await page.evaluate(() => {
|
||||
const game = window.__HEROS_GAME__;
|
||||
game?.scene.stop('CampScene');
|
||||
game?.scene.stop('BattleScene');
|
||||
game?.scene.stop('StoryScene');
|
||||
game?.scene.start('TitleScene');
|
||||
});
|
||||
await page.waitForFunction(() => {
|
||||
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
|
||||
return activeScenes.includes('TitleScene') && !activeScenes.includes('CampScene');
|
||||
});
|
||||
await page.waitForTimeout(300);
|
||||
await page.mouse.click(962, 310);
|
||||
await page.waitForFunction(() => {
|
||||
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
|
||||
return activeScenes.includes('CampScene');
|
||||
});
|
||||
|
||||
console.log(`Verified title-to-thirtieth-battle flow, recruited officer sortie selection, Ma Liang, Yi Ji, Gong Zhi, Huang Zhong, Wei Yan, Pang Tong, Fa Zheng, Wu Yi joins, Luofeng ambush, result states, and debug API at ${targetUrl}`);
|
||||
console.log(`Verified title-to-thirty-first-battle flow, recruited officer sortie selection, Ma Liang, Yi Ji, Gong Zhi, Huang Zhong, Wei Yan, Pang Tong, Fa Zheng, Wu Yi, Yan Yan joins, Luofeng and Luo main gate battles, result states, and debug API at ${targetUrl}`);
|
||||
} finally {
|
||||
await browser?.close();
|
||||
if (serverProcess && !serverProcess.killed) {
|
||||
|
||||
Reference in New Issue
Block a user