267 lines
8.5 KiB
TypeScript
267 lines
8.5 KiB
TypeScript
/**
|
|
* 玩家邮件列表
|
|
*/
|
|
|
|
import GameConf from "../../conf/GameConf";
|
|
import GameUtil from "../core/GameUtil";
|
|
import SKDataUtil from "../gear/SKDataUtil";
|
|
import SKLogger from "../gear/SKLogger";
|
|
import Player from "../object/Player";
|
|
import { EMailAction, EMailState, MsgCode } from "../role/EEnum";
|
|
import DB from "../utils/DB";
|
|
import MailData from "./MailData";
|
|
import MailMgr from "./MailMgr";
|
|
import * as schedule from "node-schedule";
|
|
import PaiHangMgr from "../core/PaiHangMgr";
|
|
|
|
export default class MailList {
|
|
owner: Player;
|
|
schedule: any;
|
|
list: MailData[];
|
|
|
|
constructor(player: Player) {
|
|
this.owner = player;
|
|
this.list = [];
|
|
|
|
this.schedule = schedule.scheduleJob("0 0 5 * * ? ", () => {
|
|
let list: [] = PaiHangMgr.shared.getJingJiRank();
|
|
let firstList = list.splice(0,5);//前五名
|
|
let lastList = list; //除了前五名
|
|
})
|
|
}
|
|
// 首次登录拉取系统邮件
|
|
setDB(rows: any) {
|
|
if(!GameConf.mailEnabled){
|
|
return;
|
|
}
|
|
this.list = [];
|
|
for (let row of rows) {
|
|
let mail = MailMgr.shared.getMailBy(row.mail_id);
|
|
if (mail) {
|
|
mail.state = row.state;
|
|
this.list.push(mail);
|
|
} else {
|
|
SKLogger.warn(`玩家邮件:玩家[${this.owner.roleid}:${this.owner.name}]拉取邮件[${row.mail_id}]为空!`);
|
|
}
|
|
}
|
|
this.check();
|
|
}
|
|
// 检查是否有新邮件
|
|
check() {
|
|
if(!GameConf.mailEnabled){
|
|
return;
|
|
}
|
|
let last = MailMgr.shared.check(this.owner, this.list);
|
|
// 通知玩家有新的邮件
|
|
if (last.length > 0) {
|
|
for (let mail of last) {
|
|
this.list.push(mail);
|
|
}
|
|
}
|
|
// 降序
|
|
this.list.sort((a, b) => {
|
|
let result = a.mail_id < b.mail_id ? 1 : -1;
|
|
return result;
|
|
});
|
|
}
|
|
// 获取邮件列表
|
|
getMailList() {
|
|
if(!GameConf.mailEnabled){
|
|
return;
|
|
}
|
|
this.saveCurveRoleAll();
|
|
let mailList: any[] = [];
|
|
for (let mail of this.list) {
|
|
if (mail.state == EMailState.REMOVE) {
|
|
continue;
|
|
}
|
|
mailList.push(mail.toObj());
|
|
// 当前玩家邮件数量大于等于当前最大邮件容量,把领取过的邮件直接删除
|
|
if (this.list.length >= GameUtil.limitMail){
|
|
if (mail.state == EMailState.GET){
|
|
mail.state = EMailState.REMOVE;
|
|
}
|
|
}
|
|
}
|
|
|
|
let params = {
|
|
list: mailList
|
|
};
|
|
|
|
this.owner.send("s2c_mail_list", params);
|
|
}
|
|
// 获得指定的邮件
|
|
getMailBy(mailId: number): MailData {
|
|
let result: MailData = null;
|
|
for (let item of this.list) {
|
|
if (item.mail_id == mailId) {
|
|
result = item;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
// 运行动作
|
|
runAction(data: any) {
|
|
// if (this.owner.relive < 1 ){
|
|
// this.owner.send("s2c_run_action",{state: MsgCode.FAILED})
|
|
// this.owner.send_notice(`一转后才可以操作邮件哦!`);
|
|
// return;
|
|
// }
|
|
this.owner.send("s2c_run_action",{state: MsgCode.SUCCESS})
|
|
if(!GameConf.mailEnabled){
|
|
return;
|
|
}
|
|
if (data.action == EMailAction.GET_ALL) {
|
|
this.getAllMailItem();
|
|
return;
|
|
}
|
|
if (data.action == EMailAction.REMOVE_ALL) {
|
|
this.removeAllNoGet();
|
|
return;
|
|
}
|
|
let mail = this.getMailBy(data.mailId);
|
|
if (mail == null) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `找不到邮件[${data.mailId}]!`
|
|
});
|
|
return;
|
|
}
|
|
if (data.action == EMailAction.GET) {
|
|
this.getMailItem(mail);
|
|
return;
|
|
}
|
|
if (data.action == EMailAction.REMOVE) {
|
|
mail.state = EMailState.REMOVE;
|
|
this.getMailList();
|
|
return;
|
|
}
|
|
}
|
|
// 领取所有邮件
|
|
private getAllMailItem() {
|
|
if (SKDataUtil.isEmptyArray(this.list)) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `您已经全部领取过全部邮件!`
|
|
});
|
|
return;
|
|
}
|
|
|
|
let change = false;
|
|
for (let mail of this.list) {
|
|
if (mail.state != EMailState.UN_GET) {
|
|
continue;
|
|
}
|
|
if (SKDataUtil.isEmptyArray(mail.gets)) {
|
|
continue;
|
|
}
|
|
if ((this.owner.getBagItemAllKindNum() + mail.gets.length) >= this.owner.bagKindNum) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `背包空间不足,无法领取邮件奖励!`
|
|
});
|
|
break;
|
|
}
|
|
for (let get of mail.gets) {
|
|
this.owner.addItem(get.itemId, get.itemCount, false, "领取邮件");
|
|
}
|
|
mail.state = EMailState.GET;
|
|
change = true;
|
|
}
|
|
if (change) {
|
|
this.getMailList();
|
|
} else {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `您没有需要领取的奖励邮件!`
|
|
});
|
|
}
|
|
}
|
|
// 删除所有不需要领取的邮件
|
|
private removeAllNoGet(){
|
|
if (SKDataUtil.isEmptyArray(this.list)) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `没有可删除的邮件!`
|
|
});
|
|
return;
|
|
}
|
|
let change = false;
|
|
for (let mail of this.list) {
|
|
if (mail.state == EMailState.UN_GET) {
|
|
if(!SKDataUtil.isEmptyArray(mail.gets)){
|
|
continue;
|
|
}
|
|
}
|
|
mail.state = EMailState.REMOVE;
|
|
change = true;
|
|
}
|
|
if (change) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `已删除已领取或无奖励的全部邮件!`
|
|
});
|
|
this.getMailList();
|
|
} else {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `没有可删除的邮件!`
|
|
});
|
|
}
|
|
}
|
|
// 领取指定邮件
|
|
private getMailItem(mail: MailData) {
|
|
if (mail.state != EMailState.UN_GET) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `邮件已领取或已删除!`
|
|
});
|
|
this.getMailList();
|
|
return;
|
|
}
|
|
if (SKDataUtil.isEmptyArray(mail.gets)) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `无邮件奖励领取!`
|
|
});
|
|
return;
|
|
}
|
|
if ((this.owner.getBagItemAllKindNum() + mail.gets.length) >= this.owner.bagKindNum) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `背包空间不足,无法领取邮件奖励!`
|
|
});
|
|
return;
|
|
}
|
|
for (let get of mail.gets) {
|
|
this.owner.addItem(get.itemId, get.itemCount, false, "领取邮件");
|
|
}
|
|
mail.state = EMailState.GET;
|
|
this.getMailList();
|
|
return;
|
|
}
|
|
// 存档
|
|
saveAll(callback: (code: MsgCode, msg: string) => void) {
|
|
if (!GameConf.mailEnabled) {
|
|
callback(MsgCode.SUCCESS, `存档:玩家[${this.owner.roleid}:${this.owner.name}]邮件关闭无需存档`);
|
|
return;
|
|
}
|
|
if (this.list.length < 1) {
|
|
callback(MsgCode.SUCCESS, `存档:玩家[${this.owner.roleid}:${this.owner.name}]邮件为空无需存档`);
|
|
return;
|
|
}
|
|
DB.saveRoleMail(this.owner.roleid, this.list, (code: MsgCode, msg: string) => {
|
|
if (code != MsgCode.SUCCESS) {
|
|
callback(MsgCode.SUCCESS, `存档:玩家[${this.owner.roleid}:${this.owner.name}]邮件存档失败[${msg}]!`);
|
|
return;
|
|
}
|
|
callback(MsgCode.SUCCESS, `存档:玩家[${this.owner.roleid}:${this.owner.name}]邮件存档成功!`);
|
|
});
|
|
}
|
|
saveCurveRoleAll() {
|
|
if (!GameConf.mailEnabled) {
|
|
return;
|
|
}
|
|
if (this.list.length < 1) {
|
|
return;
|
|
}
|
|
DB.saveRoleMail(this.owner.roleid, this.list, (code: MsgCode, msg: string) => {
|
|
if (code != MsgCode.SUCCESS) {
|
|
console.log(`领取邮件存档:玩家[${this.owner.roleid}:${this.owner.name}]邮件存档失败[${msg}]!`)
|
|
return;
|
|
}
|
|
return;
|
|
});
|
|
}
|
|
} |