317 lines
9.8 KiB
TypeScript
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}]`);
|
|
}
|
|
}
|
|
|
|
}
|