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

182 lines
5.9 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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++;
}
}
}
}
}
}