From ba3f752e26219c57b46ac6cb4525666e2b764f80 Mon Sep 17 00:00:00 2001 From: quentingruber Date: Thu, 19 Sep 2024 14:34:50 +0200 Subject: [PATCH] testing navmesh --- package.json | 2 +- .../ZoneServer2016/handlers/commands/dev.ts | 9 ++++ src/servers/ZoneServer2016/zoneserver.ts | 9 ++++ src/utils/recast.ts | 45 +++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/utils/recast.ts diff --git a/package.json b/package.json index 5e51bf023..a67e996b0 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "fix-signatures": "npx ts-node ./scripts/fixSignatures.ts && npm run prettier_sources", "gen-doc": "npm run updt-doc-config && npx typedoc", "updt-doc-config": "npx ts-node ./scripts/updateTypeDoc.ts", - "start": "node --experimental-require-module ./scripts/h1z1-server-demo-2016.js", + "start": "node --no-warnings --experimental-require-module ./scripts/h1z1-server-demo-2016.js", "start-dev": "npm run build && npm start", "start-echo": "npm run build && npm run build-benchs && node --inspect ./benchmarks/out/echo/echo-server-start.js", "lint": "npx eslint src", diff --git a/src/servers/ZoneServer2016/handlers/commands/dev.ts b/src/servers/ZoneServer2016/handlers/commands/dev.ts index e32aaf4bc..cbb03a6ab 100644 --- a/src/servers/ZoneServer2016/handlers/commands/dev.ts +++ b/src/servers/ZoneServer2016/handlers/commands/dev.ts @@ -152,6 +152,15 @@ const dev: any = { server._npcs[characterId] = zombie; const e = new EntityFromJs(EntityType.Zombie, zombie); server.aiManager.add_entity(e); + setInterval(() => { + const p = server.navigator.testNavMesh( + zombie.state.position, + client.character.state.position + ); + if (p.length) { + p.forEach((v) => zombie.goTo(v)); + } + }, 1000); }, abilities: function ( server: ZoneServer2016, diff --git a/src/servers/ZoneServer2016/zoneserver.ts b/src/servers/ZoneServer2016/zoneserver.ts index b6cc0bf27..9df6bba8a 100644 --- a/src/servers/ZoneServer2016/zoneserver.ts +++ b/src/servers/ZoneServer2016/zoneserver.ts @@ -250,6 +250,8 @@ import { RewardManager } from "./managers/rewardmanager"; import { DynamicAppearance } from "types/zonedata"; import { AiManager, EntityFromJs, EntityType } from "h1emu-ai"; import { setInterval } from "node:timers"; +import { readFileSync } from "node:fs"; +import { Navig } from "../../utils/recast"; const spawnLocations2 = require("../../../data/2016/zoneData/Z1_gridSpawns.json"), deprecatedDoors = require("../../../data/2016/sampleData/deprecatedDoors.json"), @@ -463,6 +465,7 @@ export class ZoneServer2016 extends EventEmitter { crowbarHitRewardChance!: number; crowbarHitDamage!: number; /* */ + navigator: Navig; constructor( serverPort: number, @@ -495,6 +498,7 @@ export class ZoneServer2016 extends EventEmitter { this.commandHandler = new CommandHandler(); this.playTimeManager = new PlayTimeManager(); this.aiManager = new AiManager(); + this.navigator = new Navig(); /* CONFIG MANAGER MUST BE INSTANTIATED LAST ! */ this.configManager = new ConfigManager(this, process.env.CONFIG_PATH); this.enableWorldSaves = @@ -1599,6 +1603,11 @@ export class ZoneServer2016 extends EventEmitter { } private async setupServer() { + const z1_nav = new Uint8Array( + readFileSync(__dirname + "/../../../data/2016/navData/z1.bin") + ); + await this.navigator.loadNav(z1_nav); + this.weatherManager.init(); this.playTimeManager.init(this); this.initModelsDataSource(); diff --git a/src/utils/recast.ts b/src/utils/recast.ts new file mode 100644 index 000000000..6d4cf1cf0 --- /dev/null +++ b/src/utils/recast.ts @@ -0,0 +1,45 @@ +// ====================================================================== +// +// GNU GENERAL PUBLIC LICENSE +// Version 3, 29 June 2007 +// copyright (C) 2020 - 2021 Quentin Gruber +// copyright (C) 2021 - 2024 H1emu community +// +// https://github.com/QuentinGruber/h1z1-server +// https://www.npmjs.com/package/h1z1-server +// +// Based on https://github.com/psemu/soe-network +// ====================================================================== + +import { init as initRecast, NavMesh } from "recast-navigation"; +import { NavMeshQuery } from "recast-navigation"; +import { importNavMesh } from "recast-navigation"; + +export class Navig { + navmesh!: NavMesh; + constructor() {} + async loadNav(navData: Uint8Array) { + await initRecast(); + const { navMesh } = importNavMesh(navData); + this.navmesh = navMesh; + } + testNavMesh(a: Float32Array, b: Float32Array): Float32Array[] { + console.time("calculating path"); + const navMeshQuery = new NavMeshQuery(this.navmesh); + + const start = { x: a[0], y: a[1], z: a[2] }; + const end = { x: b[0], y: b[1], z: b[2] }; + const { success, error, path } = navMeshQuery.computePath(start, end); + console.log(success); + console.log(error); + console.log(path); + console.timeEnd("calculating path"); + const pathNodes: Float32Array[] = []; + if (path) { + path.forEach((v) => { + pathNodes.push(new Float32Array([v.x, v.y, v.z])); + }); + } + return pathNodes; + } +}