xy-server/game/core/RobotMgr.ts

182 lines
5.9 KiB
TypeScript
Raw Permalink Normal View History

2025-04-23 09:34:08 +08:00
import DB from "../utils/DB";
import Player from "../object/Player";
import PlayerMgr from "../object/PlayerMgr";
import RoleUtil from "../utils/RoleUtil";
import AIMgr from "./AIMgr";
import SKDataUtil from "../gear/SKDataUtil";
import * as schedule from "node-schedule";
import {MsgCode} from "../role/EEnum";
import TeamMgr from "../core/TeamMgr";
import ChargeSum from "../core/ChargeSum";
export default class RobotMgr {
static shared: RobotMgr = new RobotMgr();
flag: number = 9000000;
maxId: number = 0;
total: number = 0;
missNum: number = 0; // 错过次数
face: any = []; // 表情
init() {
this.face = ["[50]","[51]","[52]","[53]","[51]","[54]","[51]","[55]"]
// schedule.scheduleJob("0/30 * * * * ? ", () => {
// this.getRobotMsg();
// })
}
// 上线就创建
launch() {
if (this.total == 0) {
return;
}
let self = this;
DB.readRobots(this.total, (rows: any) => {
for (let row of rows) {
let robot = new Player();
robot.setDB(row);
robot.ai = new AIMgr(robot);
PlayerMgr.shared.addPlayer(robot);
robot.onEnterMap();
self.maxId++;
}
if (self.maxId < this.total) {
for (let i = self.maxId; i < this.total; i++) {
this.createRobot();
}
}
});
}
// 创建机器人
createRobot() {
let robot: Player = new Player();
robot.roleid = SKDataUtil.rolePrimaryKey(8);
robot.onlyid = robot.roleid;
robot.accountid = robot.roleid;
RoleUtil.randomRole(robot);
PlayerMgr.shared.addPlayer(robot);
robot.onEnterMap();
}
// 机器人数量
robotTotal(): number {
let result: number = 0;
let roleList = PlayerMgr.shared.player_role_list;
for (let key in roleList) {
let roleId = SKDataUtil.numberBy(key);
let player = PlayerMgr.shared.getPlayerByRoleId(roleId);
if (player.isRobot()) {
continue;
}
result++;
}
return result
}
// 创建机器人
createRobotOn(num: number, callback: (code: number, count: number) => void) {
this.total += num;
let count = 0;
let self = this;
DB.readRobots(num, (rows: any) => {
for (let row of rows) {
let robot = new Player();
robot.onlyid = row.roleid;
robot.accountid = row.roleid;
RoleUtil.createDataRobot(robot,row);
PlayerMgr.shared.addPlayer(robot);
robot.onEnterMap();
self.maxId++;
}
if (self.maxId < num) {
for (let i = self.maxId; i < num; i++) {
this.createRobot();
count++;
}
}
callback(MsgCode.SUCCESS, count);
});
}
// 清空机器人
remoteAllRobot(num: number, callback: (code: number, count: number) => void) {
this.total -= num;
if (this.total < 0){
this.total = 0;
}
let count = 0;
let roleList: any = PlayerMgr.shared.player_role_list;
for (let key in roleList) {
if (count >= num){
continue;
}else {
let player = roleList[key];
if (player) {
if (player.isRobot()) {
player.destroy();
PlayerMgr.shared.delPlayer(key);
count++;
}
}
}
}
callback(MsgCode.SUCCESS, count);
};
getRobotMsg(){
if (this.total > 10){
if (Math.floor(Math.random() * 10) + 1 > 5 || this.missNum > 60){
this.missNum = 0;
let roleList: any = PlayerMgr.shared.player_role_list;
for (let key in roleList) {
let player = roleList[key];
if (player) {
if (player.isRobot()) {
let msg = "";
let count = Math.floor(Math.random() * 3) + 1;
for (let i = 0; i < count; i++) {
let index = Math.floor((Math.random() * this.face.length));
msg += this.face[index];
}
let data: any = {};
data.scale = 0;
data.msg = msg;
data.name = player.name;
data.resid = player.resid;
data.roleid = player.roleid;
data.onlyid = player.onlyid;
data.voice = new Uint8Array(data.voice);
data.relive = player.relive;
data.chargesum = ChargeSum.shared.getPlayerChargeSum(player.roleid);
PlayerMgr.shared.broadcast('s2c_game_chat', data);
}
}
}
}else {
this.missNum += 1;
}
}
}
robotPutInTeam(teamId: any){
let count = 1;
//输出010之间的随机整数
let num: number = 10 * Math.random();
let roleList: any = PlayerMgr.shared.player_role_list;
for (let key in roleList) {
if (count >= num){
continue;
}else {
let player = roleList[key];
if (player) {
if (player.isRobot()) {
TeamMgr.shared.requestTeam(player,teamId);
count++;
}
}
}
}
}
}