Walk fixes

This commit is contained in:
Dennis Postma 2025-02-12 12:41:33 +01:00
parent 4e7e13d6f4
commit 26405433a8
6 changed files with 103 additions and 76 deletions

View File

@ -3,7 +3,7 @@
"semi": false,
"tabWidth": 2,
"singleQuote": true,
"printWidth": 300,
"printWidth": 200,
"trailingComma": "none",
"plugins": ["@ianvs/prettier-plugin-sort-imports"],
"importOrderParserPlugins": ["typescript", "jsx", "decorators-legacy", "classProperties"],

82
package-lock.json generated
View File

@ -1052,14 +1052,14 @@
}
},
"node_modules/@mikro-orm/cli": {
"version": "6.4.5",
"resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.5.tgz",
"integrity": "sha512-Ujmpy6ZFs//2TYzi0Q1tzmrOjq+SwtkT7Iv1RUsniaF21N6R71qhQnSHdkJgVuaGGE5a6Qyp52mDWSwW4qb9EQ==",
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.6.tgz",
"integrity": "sha512-sTMoDSJrnHZBT+ZAG40OeZwR9zRTYHtaaub9OoMM2CrxfI1KeiNqL/XFB4LaM5SVRAbnoEFpMJwQ8KS+5NcN9w==",
"license": "MIT",
"dependencies": {
"@jercle/yargonaut": "1.1.5",
"@mikro-orm/core": "6.4.5",
"@mikro-orm/knex": "6.4.5",
"@mikro-orm/core": "6.4.6",
"@mikro-orm/knex": "6.4.6",
"fs-extra": "11.3.0",
"tsconfig-paths": "4.2.0",
"yargs": "17.7.2"
@ -1073,9 +1073,9 @@
}
},
"node_modules/@mikro-orm/core": {
"version": "6.4.5",
"resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.5.tgz",
"integrity": "sha512-9/CZ5oSbf4P1oBZA2HHKzuxh5yYKDNUZZq/RvJmzMdJDgV8fpTt26po/7J6UytABqZp9yXj1jXc+Kqv73vGGOA==",
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.6.tgz",
"integrity": "sha512-xVm/ALG/3vTMgh6SrvojJ6jjMa0s2hNzWN0triDB16BaNdLwWE4aAaAe+3CuoMFqJAArSOUISTEjExbzELB1ZA==",
"license": "MIT",
"dependencies": {
"dataloader": "2.2.3",
@ -1083,7 +1083,7 @@
"esprima": "4.0.1",
"fs-extra": "11.3.0",
"globby": "11.1.0",
"mikro-orm": "6.4.5",
"mikro-orm": "6.4.6",
"reflect-metadata": "0.2.2"
},
"engines": {
@ -1094,9 +1094,9 @@
}
},
"node_modules/@mikro-orm/knex": {
"version": "6.4.5",
"resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.5.tgz",
"integrity": "sha512-5D4NGD9bxmROUf8MVhR4mmZjzQtuM/Sg+eOnfOPzVaIkvuQItE4zR0Bg7gRr1XSgZ/OcJ/6q2ZoXH1HxSjykkw==",
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.6.tgz",
"integrity": "sha512-o6t67tFH/GuPZCCEtKbTTL8HDXNgB2ITjButCTZLwteL0qI9yE/f7K6K+dEUKW+hAL3KRvc2BQeumvCVWFeISg==",
"license": "MIT",
"dependencies": {
"fs-extra": "11.3.0",
@ -1125,12 +1125,12 @@
}
},
"node_modules/@mikro-orm/mariadb": {
"version": "6.4.5",
"resolved": "https://registry.npmjs.org/@mikro-orm/mariadb/-/mariadb-6.4.5.tgz",
"integrity": "sha512-fXyMZ5x1MIkQ+N7TyLgc5SjECpXRF+g0G6dvyYexdyoAo80RWPKksoZzRBrEDDbmMg8eEtpkqJ4bm29szuJijA==",
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/@mikro-orm/mariadb/-/mariadb-6.4.6.tgz",
"integrity": "sha512-n6pOf69heOsbrggqYcf9SeF9hUdkw0FbzuUAcI72jWuyNRyzNR1UATblD+vRJnwt8JDWwakjINU/bduZbcEwPw==",
"license": "MIT",
"dependencies": {
"@mikro-orm/knex": "6.4.5",
"@mikro-orm/knex": "6.4.6",
"mariadb": "3.4.0"
},
"engines": {
@ -1141,12 +1141,12 @@
}
},
"node_modules/@mikro-orm/migrations": {
"version": "6.4.5",
"resolved": "https://registry.npmjs.org/@mikro-orm/migrations/-/migrations-6.4.5.tgz",
"integrity": "sha512-cMvBLJGVXNT4iUsgjtMi3wtU9I3AtrI+JF68VFUc6tGkHgt3SS2rfrAw5MNAQaa47NXo9OfUWda4/MbRlV0VjA==",
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/@mikro-orm/migrations/-/migrations-6.4.6.tgz",
"integrity": "sha512-i0/H07g1jQS0tKVSTSkHhrmuDEHxDD3/IzkiObezTgGlD5tqN7acaSr8RDJ3DgICb8MHUDVMLwxeGy8igDB4ag==",
"license": "MIT",
"dependencies": {
"@mikro-orm/knex": "6.4.5",
"@mikro-orm/knex": "6.4.6",
"fs-extra": "11.3.0",
"umzug": "3.8.2"
},
@ -1158,12 +1158,12 @@
}
},
"node_modules/@mikro-orm/mysql": {
"version": "6.4.5",
"resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.4.5.tgz",
"integrity": "sha512-DAVroZqmXyAgIUXdiTCSRC3wG00FxE8FTi6YqcI0tE5SptJxc2t87lloRoU0oqzrwwKrlIDuBQ8le/opeiogkQ==",
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.4.6.tgz",
"integrity": "sha512-KVP9Wif9MX/RrroVgYQQUrXe9SALBQLfB9CbuJlUB7MnEcZtDi5JNX7z5kghToz0aBrTtOgsr93G1bCoM0SJkg==",
"license": "MIT",
"dependencies": {
"@mikro-orm/knex": "6.4.5",
"@mikro-orm/knex": "6.4.6",
"mysql2": "3.12.0"
},
"engines": {
@ -1174,13 +1174,13 @@
}
},
"node_modules/@mikro-orm/reflection": {
"version": "6.4.5",
"resolved": "https://registry.npmjs.org/@mikro-orm/reflection/-/reflection-6.4.5.tgz",
"integrity": "sha512-2yXbwAEKRmsJ0+Yt/6lAG+NCRgHdSOGTlzWmLvow+PfCUjSubfUM6rlowBchOAH+7swmsUFmHeeKWV6YG2SeMg==",
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/@mikro-orm/reflection/-/reflection-6.4.6.tgz",
"integrity": "sha512-7mL7HFVnaOOhDNgLjjndWyeJUtOl2wKn0spSqB8uRjS4XtwNEGVZNkW5YD1t/x7TJ99wUhe+oRDiySciiJSeBQ==",
"license": "MIT",
"dependencies": {
"globby": "11.1.0",
"ts-morph": "25.0.0"
"ts-morph": "25.0.1"
},
"engines": {
"node": ">= 18.12.0"
@ -1354,9 +1354,9 @@
}
},
"node_modules/@rushstack/terminal": {
"version": "0.14.6",
"resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.6.tgz",
"integrity": "sha512-4nMUy4h0u5PGXVG71kEA9uYI3l8GjVqewoHOFONiM6fuqS51ORdaJZ5ZXB2VZEGUyfg1TOTSy88MF2cdAy+lqA==",
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.0.tgz",
"integrity": "sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==",
"license": "MIT",
"dependencies": {
"@rushstack/node-core-library": "5.11.0",
@ -1387,12 +1387,12 @@
}
},
"node_modules/@rushstack/ts-command-line": {
"version": "4.23.4",
"resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.4.tgz",
"integrity": "sha512-pqmzDJCm0TS8VyeqnzcJ7ncwXgiLDQ6LVmXXfqv2nPL6VIz+UpyTpNVfZRJpyyJ+UDxqob1vIj2liaUfBjv8/A==",
"version": "4.23.5",
"resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz",
"integrity": "sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==",
"license": "MIT",
"dependencies": {
"@rushstack/terminal": "0.14.6",
"@rushstack/terminal": "0.15.0",
"@types/argparse": "1.0.38",
"argparse": "~1.0.9",
"string-argv": "~0.3.1"
@ -3446,9 +3446,9 @@
}
},
"node_modules/mikro-orm": {
"version": "6.4.5",
"resolved": "https://registry.npmjs.org/mikro-orm/-/mikro-orm-6.4.5.tgz",
"integrity": "sha512-CFQf87MG4c1N3J/3ELtmwFKXHBzp62o/da7dt43V9cGXygBs65KSk3EBCAdyd5VYNtu/09mt/rztanQSWNWzog==",
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/mikro-orm/-/mikro-orm-6.4.6.tgz",
"integrity": "sha512-Lr3uFK06O/4F/AtQAsuYD6QH7DgmUooSVFVGf1y02IuiKVFKOMJ4iKimkRMyoA+ykKhgYIp8WiaEqbWJVuz4Vw==",
"license": "MIT",
"engines": {
"node": ">= 18.12.0"
@ -4675,9 +4675,9 @@
}
},
"node_modules/ts-morph": {
"version": "25.0.0",
"resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.0.tgz",
"integrity": "sha512-ERPTUVO5qF8cEGJgAejGOsCVlbk8d0SDyiJsucKQT5XgqoZslv0Qml+gnui6Yy6o+uQqw5SestyW2HvlVtT/Sg==",
"version": "25.0.1",
"resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz",
"integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==",
"license": "MIT",
"dependencies": {
"@ts-morph/common": "~0.26.0",

View File

@ -270,7 +270,14 @@ export default class InitCommand extends BaseCommand {
.save()
const characterType = new CharacterType()
await characterType.setId('75b70c78-17f0-44c0-a4fa-15043cb95be0').setName('New character type').setGender(CharacterGender.MALE).setRace(CharacterRace.HUMAN).setIsSelectable(true).setSprite(characterSprite).save()
await characterType
.setId('75b70c78-17f0-44c0-a4fa-15043cb95be0')
.setName('New character type')
.setGender(CharacterGender.MALE)
.setRace(CharacterRace.HUMAN)
.setIsSelectable(true)
.setSprite(characterSprite)
.save()
}
private async createCharacterHair(): Promise<void> {

View File

@ -1,7 +1,6 @@
import { BaseEvent } from '@/application/base/baseEvent'
import { SocketEvent } from '@/application/enums'
import MapManager from '@/managers/mapManager'
import MapRepository from '@/repositories/mapRepository'
import ChatService from '@/services/chatService'
type TypePayload = {
@ -25,13 +24,6 @@ export default class ChatMessageEvent extends BaseEvent {
const character = mapCharacter.character
const mapRepository = new MapRepository()
const map = await mapRepository.getById(character.map.id)
if (!map) {
this.logger.error('chat:message error', 'Map not found')
return callback(false)
}
if (await ChatService.sendMapMessage(character.getId(), data.message)) {
return callback(true)
}

View File

@ -19,7 +19,16 @@ export class Server {
await Database.initialize()
// Initialize managers
await Promise.all([HttpManager.boot(HttpManager.getAppInstance()), SocketManager.boot(HttpManager.getAppInstance(), HttpManager.getServerInstance()), QueueManager.boot(), UserManager.boot(), MapManager.boot(), DateManager.boot(), WeatherManager.boot(), ConsoleManager.boot()])
await Promise.all([
HttpManager.boot(HttpManager.getAppInstance()),
SocketManager.boot(HttpManager.getAppInstance(), HttpManager.getServerInstance()),
QueueManager.boot(),
UserManager.boot(),
MapManager.boot(),
DateManager.boot(),
WeatherManager.boot(),
ConsoleManager.boot()
])
} catch (error: any) {
console.error(error)
this.logger.error(`Server failed to start: ${error.message}`)

View File

@ -118,35 +118,42 @@ class CharacterMoveService extends BaseService {
private findPath(start: Position, end: Position, grid: number[][]): Node[] {
const openList = new PriorityQueue<Node>((a, b) => a.f - b.f)
openList.enqueue({ ...start, g: 0, h: 0, f: 0 })
const closedSet = new Set<string>()
const getKey = (p: Position) => `${p.positionX},${p.positionY}`
while (openList.length > 0) {
const current = openList.dequeue()
if (!current) break
openList.enqueue({ ...start, g: 0, h: 0, f: 0 })
if (current.positionX === end.positionX && current.positionY === end.positionY) {
return this.reconstructPath(current)
try {
while (openList.length > 0) {
const current = openList.dequeue()
if (!current) break
if (current.positionX === end.positionX && current.positionY === end.positionY) {
return this.reconstructPath(current)
}
closedSet.add(getKey(current))
const neighbors = this.getValidNeighbors(current, grid, end)
for (const neighbor of neighbors) {
if (closedSet.has(getKey(neighbor))) continue
const g = current.g + this.getDistance(current, neighbor)
const h = this.getDistance(neighbor, end)
const f = g + h
const node: Node = {...neighbor, g, h, f, parent: current}
openList.enqueue(node)
}
}
closedSet.add(getKey(current))
const neighbors = this.getValidNeighbors(current, grid, end)
for (const neighbor of neighbors) {
if (closedSet.has(getKey(neighbor))) continue
const g = current.g + this.getDistance(current, neighbor)
const h = this.getDistance(neighbor, end)
const f = g + h
const node: Node = { ...neighbor, g, h, f, parent: current }
openList.enqueue(node)
}
return [] // No path found
} finally {
while(openList.length > 0) openList.dequeue()
closedSet.clear()
}
return [] // No path found
}
private getValidNeighbors(current: Position, grid: number[][], end: Position): Position[] {
@ -159,7 +166,13 @@ class CharacterMoveService extends BaseService {
}
private isValidPosition(pos: Position, grid: number[][], end: Position): boolean {
return pos.positionX >= 0 && pos.positionY >= 0 && pos.positionX < grid[0]!.length && pos.positionY < grid.length && (grid[pos.positionY]![pos.positionX] === 0 || (pos.positionX === end.positionX && pos.positionY === end.positionY))
return (
pos.positionX >= 0 &&
pos.positionY >= 0 &&
pos.positionX < grid[0]!.length &&
pos.positionY < grid.length &&
(grid[pos.positionY]![pos.positionX] === 0 || (pos.positionX === end.positionX && pos.positionY === end.positionY))
)
}
private getDistance(a: Position, b: Position): number {
@ -179,7 +192,13 @@ class CharacterMoveService extends BaseService {
return path
}
public validateMovementDistance(currentX: number, currentY: number, lastKnownPosition: { x: number; y: number } | null, stepDelay: number, isMoving: boolean): { isValid: boolean; maxAllowedDistance: number; actualDistance: number } {
public validateMovementDistance(
currentX: number,
currentY: number,
lastKnownPosition: { x: number; y: number } | null,
stepDelay: number,
isMoving: boolean
): { isValid: boolean; maxAllowedDistance: number; actualDistance: number } {
if (!lastKnownPosition || !isMoving) {
return { isValid: true, maxAllowedDistance: 0, actualDistance: 0 }
}