xy-server/game/core/AIMgr.ts
2025-04-23 09:34:08 +08:00

82 lines
2.9 KiB
TypeScript

import SKDataUtil from "../gear/SKDataUtil";
import SKLogger from "../gear/SKLogger";
import Player from "../object/Player";
import { EAIState } from "../role/EEnum";
import MapMgr from "./MapMgr";
import MapModel from "./MapModel";
import PathUtil from "./PathUtil";
export default class AIMgr {
private owner: Player;
private state: EAIState = EAIState.IDLE;
gridWidth: number = 20;
gridHeight: number = 20;
mapModel: MapModel;
lastTime: number = 0;
time: number = 0;
moveSpeed: number = 100;
movePath: any[] = [];
endTime: number = 0;
constructor(owner: Player) {
this.owner = owner;
this.mapModel = MapMgr.shared.getMapById(this.owner.mapid);
}
startMove() {
let startX = this.owner.x;
let startY = this.owner.y;
let pos = this.mapModel.getARandomPos();
let endX = pos.x;
let endY = pos.y;
this.movePath = this.searchMovePath(startX, startY, endX, endY);
this.state = EAIState.MOVE;
SKLogger.debug(`AI控制:[${this.owner.roleid}:${this.owner.name}]从[${startX}:${startY}]移动到[${endX},${endY}],需时:${this.endTime / 1000}`);
}
endMove() {
this.endTime = SKDataUtil.random(1, 5) * 1000;
this.state = EAIState.IDLE;
let nx = this.owner.x;
let ny = this.owner.y;
let params = {
accountid: this.owner.accountid,
roleId: this.owner.roleid,
x: nx,
y: ny,
};
this.owner.playerStop(params);
SKLogger.debug(`AI控制:[${this.owner.roleid}:${this.owner.name}]结束移动[${nx},${ny}]待机${this.endTime / 1000}`);
}
searchMovePath(startX: number, startY: number, endX: number, endY: number) {
let availableStart = PathUtil.getAvailabelPoint(startY, startX, this.mapModel.gridInfoArr, this.mapModel.rowCount, this.mapModel.lineCount);
let availableEnd = PathUtil.getAvailabelPoint(endY, endX, this.mapModel.gridInfoArr, this.mapModel.rowCount, this.mapModel.lineCount);
let result = PathUtil.searchRoad(availableStart.r, availableStart.l, availableEnd.r, availableEnd.l, this.mapModel.gridInfoArr, this.mapModel.rowCount, this.mapModel.lineCount);
return result;
};
update(dt: number) {
if (this.lastTime == 0) {
this.lastTime = dt;
return;
}
this.time += dt - this.lastTime;
this.lastTime = dt;
if (this.endTime == 0) {
if (this.state == EAIState.IDLE) {
this.startMove();
}else if(this.state==EAIState.MOVE){
}
return;
}
if (this.time > this.endTime) {
this.time = this.time - this.endTime;
this.endTime = 0;
if (this.state == EAIState.MOVE) {
this.endMove();
}
}
};
}