Files
ZYZ/game-server/app/services/guildBossService.ts
2021-01-23 17:04:25 +08:00

178 lines
6.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { BossInstanceType, BossInstanceModel } from '../db/BossInstance';
import { getTodayZeroPoint, nowSeconds } from '../pubUtils/timeUtil';
import { lockData } from '../services/redLockService';
import { findIndex, indexBy, values } from 'underscore';
import { MailModel, MailType } from '../db/Mail';
import { getRedis, sismemberAsync, smembersAsync, saddAsync, delAsync, sremAsync } from '../services/redisService';
import { pinus } from 'pinus';
import { STATUS } from '../consts/statusCode';
import { deepCopy, resResult } from '../pubUtils/util';
import { BattleRecordModel } from '../db/BattleRecord';
/**
*
* @param bossInstance
* @param roleId
*/
export async function getBossInstanceInfo(bossInstance: BossInstanceType, roleId:string) {
let { warId, ranks, bossHp, winWarId, winTime, roleIdRecords, guildCode } = bossInstance;
ranks.sort(function(a, b) {
return b.score - a.score + a.time - b.time;
});
let result:any = {};
//1等待团长开启2今日已开启且boss通关3开启中
if ( bossInstance.bossHp <= 0 ) {
if (!!winWarId && winTime > getTodayZeroPoint() && roleIdRecords.indexOf(roleId) == -1) {
result = { winWarId };
await BossInstanceModel.recordRoleIdWhenCheck(guildCode, roleId);
}
if (bossInstance.startTime < getTodayZeroPoint()) {
result.type = 1;
return result;
} else {
result.type = 2;
return result;
}
}
let isBattled = false;
let myRank = {};
let lastRanks = ranks.map(({roleId: battleRoleId, score, time}, index) => {
if (roleId == battleRoleId) {
myRank = {roleId, score, rankLv: index + 1};
if (time >= getTodayZeroPoint())
isBattled = true;
}
return {roleId, score, rankLv: index + 1};
});
return {warId, ranks: lastRanks, myRank, bossHp, type: 3, isBattled};
}
/**
* 战斗结束返回
* @param bossInstance
* @param roleId
* @param battleNum
*/
export async function getBossInstanceWhenEnd(bossInstance: BossInstanceType, roleId:string, battleNum:number) {
let { warId, ranks, bossHp, winWarId, guildCode, recordRanks, winNum } = bossInstance;
let pushRanks;
let result:any = {};
if (battleNum == winNum) {
pushRanks = deepCopy(recordRanks);
result = {warId: winWarId, bossHp: 0, type: 3};
await BossInstanceModel.recordRoleIdWhenCheck(guildCode, roleId);
} else {
pushRanks = deepCopy(ranks);
result = {warId, bossHp, type: 3};
}
pushRanks.sort(function(a, b) {
return b.score - a.score + a.time - b.time;
});
let isBattled = false;
let myRank = {};
pushRanks.forEach(({roleId: battleRoleId, score, time}, index) => {
if (roleId == battleRoleId) {
myRank = {roleId, score, rankLv: index + 1};
if (time >= getTodayZeroPoint())
isBattled = true;
}
return {roleId, score, rankLv: index + 1};
});
result.myRank = myRank;
result.ranks = pushRanks;
return result;
}
/**
* 结算战斗
* @param code
* @param serverId
* @param dataName
* @param damage
* @param roleId
*/
export async function bossResult(code: string, serverId: string, dataName: string, roleId: string, damage: number) {
let res:any = await lockData(serverId, dataName, code);//加锁
if (!!res.err)
return true;
let {winSettled, ranks, num, warId, bossHp} = await BossInstanceModel.findBossInstance(code);//锁定关卡信息
if (winSettled) {
res.releaseCallback();//解锁
await BossInstanceModel.recordRoleIdWhenCheck(code, roleId);
return true;
}
let index = findIndex(ranks, {roleId});
if (index == -1) {
res.releaseCallback();//解锁
return false;
}
ranks[index].score += bossHp;
if (bossHp > damage) {
res.releaseCallback();//解锁
return true;
}
let { recordRanks } = await BossInstanceModel.updateBossInstance(code, { bossHp: 0, winSettled: true, ranks, recordRanks: ranks, winNum: num, winWarId: warId, roleIdRecords:[roleId]}, );
await pushBossHpMessage(code, serverId, 0, true);
res.releaseCallback();//数据修改解锁
recordRanks.sort(function(a, b) {
return b.score - a.score + a.time - b.time;
});
let mails = new Array<MailType>();
let pushMessage = [];
recordRanks.forEach(async function({roleId, score}, index){
let rankLv = index + 1;
const doc = new MailModel();
let goods;
const mail = Object.assign(doc.toJSON(), {roleId, goods, sendName: '系统', mailId: 1, sendTime: nowSeconds(), content:'恭喜玩家获得演武台第' + rankLv +'名 奖励如下:'});
mails.push(mail);
let key = 'login_roleId_' + roleId;
let sid = await getRedis(key);
if (!!sid) {
pushMessage.push({route: 'onMailsAdd', data:[mail], uids: [{uid:roleId, sid}]});
}
});
await MailModel.addMails(mails);
pushMessage.forEach(({route, data, uids })=>{
pinus.app.channelService.pushMessageByUids(route, resResult(STATUS.SUCCESS, {mails:data}), uids);
});
return true;
}
export async function addBossInstance(code: string, serverId:string, roleId: string) {
let loginKey = 'login_roleId_' + roleId;
let sid = await getRedis(loginKey);
let key = 'serverId_' + serverId + 'guildCode_' + code;
let value = roleId+ '|' + sid;
saddAsync(key, [value]);
}
export async function pushBossHpMessage(code: string, serverId:string, bossHp:number, isDelKey?: boolean ) {
let key = 'serverId_' + serverId + 'guildCode_' + code;
let members = await smembersAsync(key);
let uids = members.map(member=>{
let arr = member.split('|');
let uid = arr[0];
let sid = arr[1];
return {uid, sid};
});
pinus.app.channelService.pushMessageByUids('onBossHpUpdate', resResult(STATUS.SUCCESS, {bossHp}), uids);
if (isDelKey) {
delAsync(key);
}
}
export async function checkMemberExists(code: string, serverId:string, roleId: string, battleCode:string ) {
let loginKey = 'login_roleId_' + roleId;
let sid = await getRedis(loginKey);
let key = 'serverId_' + serverId + 'guildCode_' + code ;
let value = roleId+ '|' + sid;
let flag = await sismemberAsync(key, value);
if (!flag) {
const battleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode, true);
if(!battleRecord || battleRecord.status != 0 || roleId != battleRecord.roleId) {
return false;
}
addBossInstance(code, serverId, roleId);
flag = true;
}
return flag;
}