From 7375b61b117c4454efd36ebbce1e67870b7dc9ab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:37:28 +0000 Subject: [PATCH 1/4] Initial plan From 4a56f201503bbc14b91c9f3d302d25956a4f0dfd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:41:32 +0000 Subject: [PATCH 2/4] Address review feedback: fix typos, remove unused imports, use isFinite, add factory spawning to Domination Co-authored-by: abcxff <79597906+abcxff@users.noreply.github.com> --- src/Const/Commands.ts | 16 ++++++++-------- src/Entity/Object.ts | 2 +- src/Entity/Tank/Barrel.ts | 2 +- src/Gamemodes/Domination.ts | 4 +++- src/Gamemodes/Survival.ts | 2 +- src/Gamemodes/Team2.ts | 1 - src/Gamemodes/Team4.ts | 1 - src/Native/Arena.ts | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Const/Commands.ts b/src/Const/Commands.ts index 72aae7ee..f4a780bd 100644 --- a/src/Const/Commands.ts +++ b/src/Const/Commands.ts @@ -209,7 +209,7 @@ export const commandCallbacks = { game_set_level: (client: Client, levelArg: string) => { const level = parseInt(levelArg); const player = client.camera?.cameraData.player; - if (isNaN(level) || !Entity.exists(player) || !TankBody.isTank(player)) return; + if (!isFinite(level) || !Entity.exists(player) || !TankBody.isTank(player)) return; const finalLevel = client.accessLevel == AccessLevel.FullAccess ? level : Math.min(maxPlayerLevel, level); client.camera?.setLevel(finalLevel); }, @@ -217,7 +217,7 @@ export const commandCallbacks = { const score = parseInt(scoreArg); const camera = client.camera?.cameraData; const player = client.camera?.cameraData.player; - if (isNaN(score) || score > Number.MAX_SAFE_INTEGER || score < Number.MIN_SAFE_INTEGER || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; + if (!isFinite(score) || score > Number.MAX_SAFE_INTEGER || score < Number.MIN_SAFE_INTEGER || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; camera.score = score; }, game_set_stat_max: (client: Client, statIdArg: string, statMaxArg: string) => { @@ -225,7 +225,7 @@ export const commandCallbacks = { const statMax = parseInt(statMaxArg); const camera = client.camera?.cameraData; const player = client.camera?.cameraData.player; - if (statId < 0 || statId >= StatCount || isNaN(statId) || isNaN(statMax) || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; + if (statId < 0 || statId >= StatCount || !isFinite(statId) || !isFinite(statMax) || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; const clampedStatMax = Math.max(statMax, 0); camera.statLimits[statId as Stat] = clampedStatMax; camera.statLevels[statId as Stat] = Math.min(camera.statLevels[statId as Stat], clampedStatMax); @@ -235,14 +235,14 @@ export const commandCallbacks = { const statPoints = parseInt(statPointsArg); const camera = client.camera?.cameraData; const player = client.camera?.cameraData.player; - if (statId < 0 || statId >= StatCount || isNaN(statId) || isNaN(statPoints) || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; + if (statId < 0 || statId >= StatCount || !isFinite(statId) || !isFinite(statPoints) || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; camera.statLevels[statId as Stat] = statPoints; }, game_add_upgrade_points: (client: Client, pointsArg: string) => { const points = parseInt(pointsArg); const camera = client.camera?.cameraData; const player = client.camera?.cameraData.player; - if (isNaN(points) || points > Number.MAX_SAFE_INTEGER || points < Number.MIN_SAFE_INTEGER || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; + if (!isFinite(points) || points > Number.MAX_SAFE_INTEGER || points < Number.MIN_SAFE_INTEGER || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; camera.statsAvailable += points; }, game_teleport: (client: Client, xArg: string, yArg: string) => { @@ -254,7 +254,7 @@ export const commandCallbacks = { const x = xArg.match(RELATIVE_POS_REGEX) ? player.positionData.x + parseInt(xArg.slice(1) || "0", 10) : parseInt(xArg, 10); const y = yArg.match(RELATIVE_POS_REGEX) ? player.positionData.y + parseInt(yArg.slice(1) || "0", 10) : parseInt(yArg, 10); - if (isNaN(x) || isNaN(y)) return; + if (!isFinite(x) || !isFinite(y)) return; player.positionData.x = x; player.positionData.y = y; @@ -355,11 +355,11 @@ export const commandCallbacks = { ["Triangle", Triangle] ] as [string, typeof ObjectEntity][]).get(entityArg); - if (isNaN(count) || count < 0 || !game || !TEntity) return; + if (!isFinite(count) || count < 0 || !game || !TEntity) return; for (let i = 0; i < count; ++i) { const boss = new TEntity(game); - if (!isNaN(x) && !isNaN(y)) { + if (isFinite(x) && isFinite(y)) { boss.positionData.x = x; boss.positionData.y = y; } diff --git a/src/Entity/Object.ts b/src/Entity/Object.ts index 44c45c1a..e4107268 100644 --- a/src/Entity/Object.ts +++ b/src/Entity/Object.ts @@ -18,7 +18,7 @@ import * as util from "../util"; import GameServer from "../Game"; -import Vector, { VectorAbstract } from "../Physics/Vector"; +import Vector from "../Physics/Vector"; import { PhysicsGroup, PositionGroup, RelationsGroup, StyleGroup } from "../Native/FieldGroups"; import { Entity } from "../Native/Entity"; diff --git a/src/Entity/Tank/Barrel.ts b/src/Entity/Tank/Barrel.ts index 73424630..3011716c 100644 --- a/src/Entity/Tank/Barrel.ts +++ b/src/Entity/Tank/Barrel.ts @@ -105,7 +105,7 @@ export default class Barrel extends ObjectEntity { /** Number of drones that this barrel shot that are still alive. */ public droneCount = 0; - /** The barrel"s addons */ + /** The barrel's addons */ public addons: BarrelAddon[] = []; /** Always existant barrel field group, present on all barrels. */ diff --git a/src/Gamemodes/Domination.ts b/src/Gamemodes/Domination.ts index ae0a4529..f6644864 100644 --- a/src/Gamemodes/Domination.ts +++ b/src/Gamemodes/Domination.ts @@ -18,7 +18,6 @@ import Client from "../Client"; import { Color, ColorsHexCode, ArenaFlags, ValidScoreboardIndex, ClientBound } from "../Const/Enums"; -import ObjectEntity from "../Entity/Object"; import Dominator from "../Entity/Misc/Dominator"; import TeamBase from "../Entity/Misc/TeamBase"; import { TeamEntity } from "../Entity/Misc/TeamEntity"; @@ -94,6 +93,9 @@ export default class DominationArena extends ArenaEntity { const team = this.decideTeam(client); TeamEntity.setTeam(team, tank); + const success = this.attemptFactorySpawn(tank); + if (success) return; + const teamBase = team.base; if (!teamBase) return super.spawnPlayer(tank, client); diff --git a/src/Gamemodes/Survival.ts b/src/Gamemodes/Survival.ts index 61033508..b96a672f 100644 --- a/src/Gamemodes/Survival.ts +++ b/src/Gamemodes/Survival.ts @@ -24,7 +24,7 @@ import TankBody from "../Entity/Tank/TankBody"; import ShapeManager from "../Misc/ShapeManager"; import { ArenaFlags, ClientBound } from "../Const/Enums"; -import { tps, countdownDuration, scoreboardUpdateInterval } from "../config"; +import { countdownDuration, scoreboardUpdateInterval } from "../config"; const MIN_PLAYERS = 4; // 6 in Diep.io diff --git a/src/Gamemodes/Team2.ts b/src/Gamemodes/Team2.ts index ff2179f4..7a96cf77 100644 --- a/src/Gamemodes/Team2.ts +++ b/src/Gamemodes/Team2.ts @@ -20,7 +20,6 @@ import GameServer from "../Game"; import ArenaEntity from "../Native/Arena"; import Client from "../Client"; -import ObjectEntity from "../Entity/Object"; import TeamBase from "../Entity/Misc/TeamBase"; import TankBody from "../Entity/Tank/TankBody"; diff --git a/src/Gamemodes/Team4.ts b/src/Gamemodes/Team4.ts index b0ce55c6..8adfe92e 100644 --- a/src/Gamemodes/Team4.ts +++ b/src/Gamemodes/Team4.ts @@ -20,7 +20,6 @@ import GameServer from "../Game"; import ArenaEntity from "../Native/Arena"; import Client from "../Client"; -import ObjectEntity from "../Entity/Object"; import TeamBase from "../Entity/Misc/TeamBase"; import TankBody from "../Entity/Tank/TankBody"; diff --git a/src/Native/Arena.ts b/src/Native/Arena.ts index 32f4950b..2bc6befd 100644 --- a/src/Native/Arena.ts +++ b/src/Native/Arena.ts @@ -32,7 +32,7 @@ import { TeamEntity, TeamGroupEntity } from "../Entity/Misc/TeamEntity"; import Client from "../Client"; -import { countdownDuration, bossSpawningInterval, factorySpawnChance, scoreboardUpdateInterval } from "../config"; +import { countdownDuration, factorySpawnChance, scoreboardUpdateInterval } from "../config"; export const enum ArenaState { /** Countdown, waiting for players screen */ From f0ef8025cf66687d0366f4efcbd9771d90e28b5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:43:13 +0000 Subject: [PATCH 3/4] Remove redundant MAX_SAFE_INTEGER checks with isFinite Co-authored-by: abcxff <79597906+abcxff@users.noreply.github.com> --- src/Const/Commands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Const/Commands.ts b/src/Const/Commands.ts index f4a780bd..443e753f 100644 --- a/src/Const/Commands.ts +++ b/src/Const/Commands.ts @@ -217,7 +217,7 @@ export const commandCallbacks = { const score = parseInt(scoreArg); const camera = client.camera?.cameraData; const player = client.camera?.cameraData.player; - if (!isFinite(score) || score > Number.MAX_SAFE_INTEGER || score < Number.MIN_SAFE_INTEGER || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; + if (!isFinite(score) || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; camera.score = score; }, game_set_stat_max: (client: Client, statIdArg: string, statMaxArg: string) => { @@ -242,7 +242,7 @@ export const commandCallbacks = { const points = parseInt(pointsArg); const camera = client.camera?.cameraData; const player = client.camera?.cameraData.player; - if (!isFinite(points) || points > Number.MAX_SAFE_INTEGER || points < Number.MIN_SAFE_INTEGER || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; + if (!isFinite(points) || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; camera.statsAvailable += points; }, game_teleport: (client: Client, xArg: string, yArg: string) => { From 8464f66f78e4600c508faa2d1944443870808c8b Mon Sep 17 00:00:00 2001 From: ABC <79597906+abcxff@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:48:17 -0500 Subject: [PATCH 4/4] Add back bounds checking for score and points in commands --- src/Const/Commands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Const/Commands.ts b/src/Const/Commands.ts index 443e753f..f4a780bd 100644 --- a/src/Const/Commands.ts +++ b/src/Const/Commands.ts @@ -217,7 +217,7 @@ export const commandCallbacks = { const score = parseInt(scoreArg); const camera = client.camera?.cameraData; const player = client.camera?.cameraData.player; - if (!isFinite(score) || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; + if (!isFinite(score) || score > Number.MAX_SAFE_INTEGER || score < Number.MIN_SAFE_INTEGER || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; camera.score = score; }, game_set_stat_max: (client: Client, statIdArg: string, statMaxArg: string) => { @@ -242,7 +242,7 @@ export const commandCallbacks = { const points = parseInt(pointsArg); const camera = client.camera?.cameraData; const player = client.camera?.cameraData.player; - if (!isFinite(points) || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; + if (!isFinite(points) || points > Number.MAX_SAFE_INTEGER || points < Number.MIN_SAFE_INTEGER || !Entity.exists(player) || !TankBody.isTank(player) || !camera) return; camera.statsAvailable += points; }, game_teleport: (client: Client, xArg: string, yArg: string) => {