forked from noxious/server
Walk fixes
This commit is contained in:
parent
4e7e13d6f4
commit
26405433a8
@ -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
82
package-lock.json
generated
@ -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",
|
||||
|
@ -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> {
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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}`)
|
||||
|
@ -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 }
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user