Files
ZYZ/game-server/app/servers/battle/handler/eventBattleHandler.ts
2020-10-14 20:17:05 +08:00

224 lines
8.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 { Application, BackendSession, FrontendOrBackendSession } from 'pinus';
import { getGamedata } from '../../../util/gamedata';
import { EventRecordModel } from '../../../db/EventRecord';
import { RoleModel } from '../../../db/Role';
import { genCode, decodeStr, decodeStrSingle, Reward } from '../../../util/util';
import { EVENT_STATUS, EVENT_RECORD_STATUS, EVENT_TYPE } from '../../../consts/consts';
export default function(app: Application) {
return new EventBattleHandler(app);
}
export class EventBattleHandler {
constructor(private app: Application) {
}
// 获取关卡列表
async receiveEventReward(msg: { eventId: number, eventCode: string, isSuccess: boolean }, session: BackendSession) {
const {eventId, eventCode, isSuccess} = msg;
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let eventStatus = session.get('eventStatus');
let event = await EventRecordModel.getEventRecordByCode(roleId, eventCode);
if(!event) {
return { code: 202, data: '未找到记录' }
}
let { status, type, eventId: dataEventId } = event;
let flag; // 检查状态是否正确
if(type == EVENT_TYPE.BATTLE) {
if(status == EVENT_RECORD_STATUS.BATTLE_SUCCESS && isSuccess) {
flag = true;
} else if (status == EVENT_RECORD_STATUS.BATTLE_FAIL && !isSuccess) {
flag = true;
}
} else {
if(status == EVENT_RECORD_STATUS.WAITING) {
flag = true;
}
}
if(!flag) {
return { code: 202, data: '状态错误' }
}
if(dataEventId != eventId) {
return { code: 202, data: '事件id错误' }
}
let dicEvent = getGamedata('dic_zyz_event');
let curEvent = dicEvent.find(cur => cur.eventID == eventId);
if(!curEvent) {
return { code: 202, data: '未找到该事件' };
}
// 保存状态
let result = await EventRecordModel.setStatusByCode(roleId, eventCode, isSuccess?EVENT_RECORD_STATUS.SUCCESS_RECEIVED:EVENT_RECORD_STATUS.FAIL_RECEIVED);
// 保存奖励
let rewardStr = isSuccess?curEvent.winReward:curEvent.loseReward;
let rewards = decodeStr('fixReward', rewardStr);
let rewardObject = new Reward(roleId, roleName, rewards);
let goods = await rewardObject.saveReward();
if(eventStatus == EVENT_STATUS.STARTING) { // 如果是第一次开启的挑战,保存成开启状态
await RoleModel.setEventStatus(roleId, EVENT_STATUS.OPEN);
// 第一场时间挑战完,开始正常刷新事件,所以刷新时间也重置起来
session.set('eventStatus', EVENT_STATUS.OPEN);
session.push('eventStatus', () => {});
}
// 推送消息刷新
await checkEvent(this.app, session, true);
return {
code: 200,
data: {
eventCode: result.eventCode,
eventId: result.eventId,
status: result.status,
goods
}
}
}
}
export async function setBattleStatus(app: Application, session: FrontendOrBackendSession, roleId: string, battleId: number , isSuccess: boolean, battleCode: string) {
let now = new Date();
let eventStatus = session.get('eventStatus');
let refTime = eventStatus == EVENT_STATUS.OPEN? getEventTime(now): 0;
console.log('***setBattleStatus', eventStatus, refTime)
let { BATTLE_SUCCESS, BATTLE_FAIL } = EVENT_RECORD_STATUS;
let result = await EventRecordModel.setBattleStatus(roleId, battleId, refTime, isSuccess?BATTLE_SUCCESS:BATTLE_FAIL, battleCode);
await checkEvent(app, session, true);
return result;
}
export function getEventTime(now: Date) {
let curTime = Number(now);
let todayA = now.setHours(12, 0, 0, 0); // 每天12点
let todayB = now.setHours(18, 0, 0, 0); // 每天18点
let yesterdayA = todayA - 86400000; // 前一天12点
let t = 0;
if(curTime < todayA) {
t = yesterdayA;
} else if (curTime >= todayA && curTime < todayB) {
t = todayA;
} else if (curTime >= todayB) {
t = todayB;
}
return t
}
export async function startEvent(app: Application, session: FrontendOrBackendSession) {
// console.log('*******setEventStatus')
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let channelName = roleId;
let event = await refreshEvent(1, roleId, roleName, 0); // 刷新初始的一件
await RoleModel.setEventStatus(roleId, EVENT_STATUS.STARTING);
session.set('eventStatus', EVENT_STATUS.STARTING);
session.push('eventStatus', () => {});
pushEventMsg(app, roleId, channelName, { event }); // 推送
}
export async function checkEvent(app: Application, session: FrontendOrBackendSession, isForce:boolean = false) {
try {
let roleId = session.get('roleId');
if(roleId) {
let roleName = session.get('roleName');
let channelName = roleId;
let eventStatus = session.get('eventStatus')||EVENT_STATUS.WAITING;
let eventTime = session.get('getEventTime')||0;
let now = new Date();
let t = getEventTime(now);
let channel = app.get('channelService').getChannel(channelName, false);
console.log('****channel', channelName, !!channel, eventTime, t, eventStatus)
if(!!channel && (eventTime < t || isForce)) { // 第一次登陆后可以刷新了
if (eventStatus == EVENT_STATUS.STARTING) {
let event = await EventRecordModel.getEventRecordByTime(roleId, 0);
pushEventMsg(app, roleId, channelName, { event }); // 推送
session.set('getEventTime', t);
session.push('getEventTime', () => {});
} else if( eventStatus == EVENT_STATUS.OPEN ) {
let event = await EventRecordModel.getEventRecordByTime(roleId, t);
if(event.length == 0) { // 刷新
const num = 3; // 每次刷3个
event = await refreshEvent(num, roleId, roleName, t);
}
console.log(event)
// 推送
pushEventMsg(app, roleId, channelName, { event });
session.set('getEventTime', t);
session.push('getEventTime', () => {});
}
}
}
return;
}catch(err) {
console.log(err.stack);
throw err
}
}
async function refreshEvent(num: number, roleId: string, roleName: string, t) {
let event = new Array();
let dicEvent = getGamedata('dic_zyz_event');
let role = await RoleModel.findByRoleId(roleId);
dicEvent = dicEvent.filter(cur => { // 筛选适合等级
let { suitLevel } = cur;
suitLevel = decodeStrSingle('eventSuitLevel', suitLevel);
return suitLevel.min <= role.lv && suitLevel.max >= role.lv
});
let historyRecord = await EventRecordModel.getHostoryEventRecord(roleId);
let {history, turn} = historyRecord;
let randomList = dicEvent.filter(cur => {
return history.find(ccur => {
return ccur.eventId != cur.eventID;
});
});
console.log(JSON.stringify(randomList));
for(let i = 0; i < num; i++) {
if(randomList.length == 0) { // 一轮刷新过,开始新的一轮,保证所有事件都能刷新一遍
turn ++;
randomList = [...dicEvent];
}
if(randomList.length == 0) break; // 如果还是为0pass
let index = Math.floor(Math.random() * randomList.length);
let dic = randomList[index];
let eventCode = genCode(8);
let data = await EventRecordModel.saveEventRecord(eventCode, {
roleId, refTime: t, eventId: dic.eventID,
roleName, turn, type: dic.eventType, battleId: dic.warId||0, quality: dic.quality,
status: EVENT_RECORD_STATUS.WAITING
});
event.push(data)
randomList.splice(index, 1);
}
return event;
}
function pushEventMsg(app, roleId, channelName, msg ) {
console.log('***pushEventMsg', channelName)
let channelService = app.get('channelService');
let param = { msg };
let channel = channelService.getChannel(channelName, false);
if(!!channel) {
let tsid = channel.getMember(roleId)['sid'];
channelService.pushMessageByUids('onSpecialEvent', param, [{
uid: roleId,
sid: tsid
}]);
}
}