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}]`); } } }