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

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