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

317 lines
9.8 KiB
TypeScript

import SKDataUtil from "../gear/SKDataUtil";
import SKLogger from "../gear/SKLogger";
import GameUtil from "../core/GameUtil";
import RobotMgr from "../core/RobotMgr";
import Player from "./Player";
import SKRedisUtil from "../gear/SKRedisUtil";
import Signal from "../core/Signal";
// 玩家管理器
export default class PlayerMgr {
// 单例
static shared = new PlayerMgr();
saved: boolean = false;
propRoleData: any;
player_num: number;
player_num_peak: number;
player_role_list: { [key: number]: Player };
player_only_list: { [key: number]: Player };
// 存档
static saveAll(callback: (msg: string) => void) {
this.shared.saveAll(callback);
}
constructor() {
this.propRoleData = null;
this.player_num = 0;
this.player_num_peak = 0;
this.player_role_list = {};
this.player_only_list = {};
}
launch() {
let propRoleData = GameUtil.require_ex('../../conf/prop_data/prop_role_data');
if (propRoleData) {
this.propRoleData = {};
for (const id in propRoleData) {
if (propRoleData.hasOwnProperty(id)) {
const data = propRoleData[id];
if (this.propRoleData[data.race] == null) {
this.propRoleData[data.race] = {};
}
if (this.propRoleData[data.race][data.relive] == null) {
this.propRoleData[data.race][data.relive] = {};
}
this.propRoleData[data.race][data.relive][data.level] = data;
}
}
} else {
SKLogger.warn('prop_role_data 角色属性表加载失败');
}
}
update(dt: number) {
for (let roleId in this.player_role_list) {
let player = this.player_role_list[roleId];
if (player) {
player.update(dt);
}
}
}
addPlayer(player: Player) {
this.player_role_list[player.roleid] = player;
this.player_only_list[player.onlyid] = player;
this.updatePlayerNum();
}
getPlayerByOnlyId(onlyId: any, isWarn: boolean = true): Player {
let result = SKDataUtil.valueForKey(this.player_only_list, onlyId);
if (result == null && isWarn) {
SKLogger.warn(`$警告:找不到玩家:onlyId=${onlyId}`);
}
return result;
}
getPlayerByRoleId(roleId: number, prefix: string = ""): Player {
let result = this.player_role_list[roleId];
if (result == null && prefix.length > 0) {
SKLogger.warn(`${prefix}找不到玩家:roleId=${roleId}`);
}
return result;
}
getLikePlayer(info: any): any {
let list = [];
for (let roleId in this.player_role_list) {
let player = this.player_role_list[roleId];
if (!player) {
continue;
}
if (player.roleid == info || player.name.indexOf(info) != -1) {
list.push(player);
}
}
return list;
}
delPlayer(roleId: any) {
let player = this.getPlayerByRoleId(roleId);
if (player != null) {
delete this.player_role_list[player.roleid];
delete this.player_only_list[player.onlyid];
this.updatePlayerNum();
}
}
updatePlayerNum() {
let total = 0;
for (let key in this.player_role_list) {
let player = this.player_role_list[key];
if (player && !player.offline) {
total++;
}
}
this.player_num = total;
if (total > this.player_num_peak) {
this.player_num_peak = total;
}
}
getPlayerNum(): any {
return this.player_num;
}
getPlayerNumPeak(): any {
return this.player_num_peak;
}
getPropRoleData(race: any, relive: any, level: any) {
if (race == null || relive == null || level == null) {
return null;
}
if (this.propRoleData[race] && this.propRoleData[race][relive] && this.propRoleData[race][relive][level]) {
return this.propRoleData[race][relive][level];
}
return null;
}
sendToPlayer(onlyid: number, event: any, obj: any) {
let player = this.getPlayerByOnlyId(onlyid);
if (player) {
player.send(event, obj);
}
}
// 准备关服
readyToCloseServer() {
let t = 10;
let t_timer = setInterval(() => {
this.broadcast('s2c_game_chat', {
onlyid: 0,
roleid: 0,
scale: 3,
msg: `请注意:服务器在 ${t}秒 后关闭`,
name: '',
resid: 0,
teamid: 0,
});
t--;
if (t <= 0) {
clearInterval(t_timer);
}
}, 1000);
}
// 通知所有玩家 type = 1(队伍)
broadcast(event: any, obj?: any, type: number = 0) {
for (let key in this.player_role_list) {
let player = this.player_role_list[key];
if (type == 1) {
if (player) {
// 如果在队伍中则不通知队伍信息
if (player.teamid == 0) {
player.send(event, obj);
}
}
} else {
if (player) {
player.send(event, obj);
}
}
}
}
broadcastEmail(){
for (let key in this.player_role_list) {
let player = this.player_role_list[key];
if(player){
player.send("s2c_friend_apply", {});
}
}
}
// 通知传送过来的角色
broadcastPart(list: any[],event: any, obj?: any){
for (let i = 0; i < list.length; i++) {
if (list[i] != undefined){
let player = this.player_role_list[list[i]];
if (player) {
player.send(event, obj);
}
}
}
}
// 全部存档
saveAll(callback: (msg: string) => void) {
if (this.saved) {
let msg = `存档:共[${GameUtil.saveTotal}]个玩家正在存档中...`;
callback(msg);
return;
}
GameUtil.robotCount = RobotMgr.shared.robotTotal();
GameUtil.saveTotal = SKDataUtil.getLength(this.player_role_list);
if (GameUtil.saveTotal < 1) {
let msg = `玩家存档:数量少于1个,无需存档`;
this.saved = false;
callback(msg);
return;
}
this.saved = true;
// 重置存档计数
GameUtil.online = 0;
GameUtil.robotCount = 0;
GameUtil.saveCount = 0;
GameUtil.saveFailed = [];
for (let roleId in this.player_role_list) {
let player = this.player_role_list[roleId];
if (player == null) {
SKLogger.info(`找不到玩家 编号:${roleId} `);
continue;
} else {
if (player.isRobot()) {
GameUtil.robotCount++;
} else if (!player.offline) {
GameUtil.online++;
}
}
let self = this;
SKLogger.info(`存档玩家:${player.name} 编号:${player.roleid} 当前等级:${player.roleid}`);
player.saveAll((failed: string[]) => {
GameUtil.saveCount++;
if (failed.length > 0) {
GameUtil.saveFailed.push({role_id: player.roleid, role_name: player.name, failed: failed});
}
// 全部玩家存档完成
if (GameUtil.saveCount >= GameUtil.saveTotal) {
self.saved = false;
let failedTotal = GameUtil.saveFailed.length;
let msg = `玩家存档:服务器[${GameUtil.serverName}]:存档失败[${failedTotal}]机器人数[${GameUtil.robotCount}]在线玩家数[${GameUtil.online}]总玩家数[${GameUtil.saveTotal - GameUtil.robotCount}]:所有玩家存档完毕!`;
callback(msg);
}
});
}
}
// 重置所有玩家的每日限购数
clearAllDayCount() {
for (let key in this.player_role_list) {
let player: Player = this.player_role_list[key];
if (player != null) {
player.clearDayMap();
player.clearDayMapVip();
}
}
SKLogger.info(`重置所有玩家每日限购数完成!`);
}
OnNewDay() {
for (let key in this.player_role_list) {
let player = this.player_role_list[key];
if (player) {
player.on5oclock();
}
}
}
// OnNewHour() {
// for (let key in this.player_role_list) {
// let player = this.player_role_list[key];
// if (player) {
// player.OnNewHour();
// }
// }
// }
// 清除玩家缓存
clearPlayerCache(roleId: any) {
let player = this.getPlayerByRoleId(roleId);
if (player != null) {
if (player.agent) {
player.agent.close();
}
this.delPlayer(roleId);
}
}
// 踢下线
kickedOutPlayer(roleList: any[]) {
for (let roleId of roleList) {
if (roleId == 0) {
break;
}
let player = this.getPlayerByRoleId(roleId);
if (player == null) {
return;
}
Signal.shared.DeleteTocken(player.accountid);
player.destroy();
SKLogger.info(`踢出玩家[${player.roleid}:${player.name}]`);
}
}
}