diff --git a/game-server/app/servers/guild/handler/raceActivityHandler.ts b/game-server/app/servers/guild/handler/raceActivityHandler.ts index cda59a420..e648eeff8 100644 --- a/game-server/app/servers/guild/handler/raceActivityHandler.ts +++ b/game-server/app/servers/guild/handler/raceActivityHandler.ts @@ -1,7 +1,7 @@ import { Application, ChannelService, BackendSession, HandlerService, } from "pinus"; import { GUILD_ACTIVITY_TYPE, STATUS, GUILD_ACTIVITY_STATUS, GUILD_POINT_WAYS, REDIS_KEY, TASK_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../../consts"; import { genCode, resResult } from "../../../pubUtils/util"; -import { getGuildActivityStatus, getRaceActivityObj, getWoodenHorseList, calWoodenHorseAndSend, raceActivitySettleReward, getGAIndexInPinus } from "../../../services/guildActivity/guildActivityService"; +import { getGuildActivityStatus, getRaceActivityObj, getWoodenHorseList, getGAIndexInPinus, getJoinIndex } from "../../../services/guildActivity/guildActivityService"; import { UserGuildModel } from "../../../db/UserGuild"; import { GuildActivityRecordModel } from "../../../db/GuildActivityRec"; import { UserGuildActivityRecModel } from "../../../db/UserGuildActivityRec"; @@ -48,7 +48,7 @@ export class RaceActivityHandler { let ranks: { myGuildRank?: RaceActivityRankParam, guildRank?: RaceActivityRankParam[] } = {}; let hasJoin = obj.getMember(guildCode, roleId); - if(obj.status == RACE_ACTIVITY_STATUS.START) { + if(obj.status == GUILD_ACTIVITY_STATUS.START) { ranks = await obj.getRanks(serverId, guildCode); } else { let index = getGAIndexInPinus(this.aid); @@ -81,7 +81,7 @@ export class RaceActivityHandler { const guildCode = session.get('guildCode'); const sid = session.get('sid'); if (!guildCode) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); - let index = getGAIndexInPinus(this.aid); + let joinIndex = getJoinIndex(); let statusResult = getGuildActivityStatus(this.aid); if (!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); @@ -93,8 +93,7 @@ export class RaceActivityHandler { return resResult(STATUS.RACE_HAS_JOIN); } - - let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, index, obj.getEvents(guildCode, 0)); + let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, joinIndex, obj.getEvents(guildCode, 0)); if (!guildActivityRec) return resResult(STATUS.WRONG_PARMS); let { code: sourceCode } = guildActivityRec; @@ -162,7 +161,7 @@ export class RaceActivityHandler { let serverId = session.get('serverId'); let guildCode = session.get('guildCode'); let sid = session.get('sid'); - let index = getGAIndexInPinus(this.aid); + let joinIndex = getJoinIndex(); let { id, count, toGuild } = msg; let obj = getRaceActivityObj(); @@ -172,7 +171,7 @@ export class RaceActivityHandler { let event = await obj.useItem(serverId, roleId, sid, guildCode, toGuild, id, count); if (!event) return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); - await GuildActivityRecordModel.pushEvent(guildCode, this.aid, index, event); + await GuildActivityRecordModel.pushEvent(guildCode, this.aid, joinIndex, event); return resResult(STATUS.SUCCESS, { timestamp: Date.now(), @@ -186,13 +185,13 @@ export class RaceActivityHandler { let serverId = session.get('serverId'); let { code, isSuccess } = msg; - let index = getGAIndexInPinus(this.aid); + let joinIndex = getJoinIndex(); let statusResult = getGuildActivityStatus(this.aid); if (!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); // 更新userGuildActivityRecord - let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, index); + let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, joinIndex); let myGuildActivityRec = await UserGuildActivityRecModel.updateInfo(code, { isSuccess, isCompleted: true }); if (!guildActivityRec || !myGuildActivityRec) return resResult(STATUS.WRONG_PARMS); @@ -205,7 +204,7 @@ export class RaceActivityHandler { let obj = getRaceActivityObj(); let myGuildRank = 0; let woodenHorse = await obj.getWoodenHorse(guildCode, serverId); - if(obj.status == RACE_ACTIVITY_STATUS.START) { + if(obj.status == GUILD_ACTIVITY_STATUS.START) { let { myGuildRank: rank, guildRank } = await obj.getRanks(serverId, guildCode); // console.log('#', JSON.stringify(guildRank)) myGuildRank = rank?.rank||0; @@ -227,17 +226,6 @@ export class RaceActivityHandler { }) } - async settleReward(msg: { serverId: number }, session: BackendSession) { - let guildCode = session.get('guildCode'); - let serverId = session.get('serverId'); - let obj = getRaceActivityObj(); - let woodenHorse = await obj.getWoodenHorse(guildCode, serverId); - if (woodenHorse) { - await raceActivitySettleReward(guildCode, woodenHorse) - } - } - - // 加入木马 async debugAddHorse(msg: { magicWord: string, memberCnt: number }, session: BackendSession) { const { magicWord, memberCnt } = msg; diff --git a/game-server/app/services/guildActivity/gateActivityObj.ts b/game-server/app/services/guildActivity/gateActivityObj.ts index 6f9f9e24c..964dbb8e6 100644 --- a/game-server/app/services/guildActivity/gateActivityObj.ts +++ b/game-server/app/services/guildActivity/gateActivityObj.ts @@ -31,16 +31,16 @@ export class GateActivityObject { } public pushMembers(guildCode: string, serverId: number, roleId: string, job: number, code: string) { - + let member: Member; if(this.members.has(guildCode)) { let members = this.members.get(guildCode); if(members.findIndex(cur => cur.roleId == roleId) == -1) { - members.push({ roleId, job, code }); + member = { roleId, job, code } + members.push(member); } } else { - let arr = new Array(); - arr.push(roleId); - this.members.set(guildCode, [{ roleId, job, code }]); + member = { roleId, job, code } + this.members.set(guildCode, [member]); } if(this.guilds.has(serverId)) { let arr = this.guilds.get(serverId); @@ -49,7 +49,7 @@ export class GateActivityObject { } else { this.guilds.set(serverId, [guildCode]); } - + return member; } public getMemberRecord(recCode: string, roleId: string) { diff --git a/game-server/app/services/guildActivity/guildActivityService.ts b/game-server/app/services/guildActivity/guildActivityService.ts index 58943be2e..ccd06e0b9 100644 --- a/game-server/app/services/guildActivity/guildActivityService.ts +++ b/game-server/app/services/guildActivity/guildActivityService.ts @@ -5,7 +5,7 @@ import { gameData, getGuildAuctionRewards, getCityActivityRewards, getGuildAucti import { getCurDay, nowSeconds, getTimeFun, getZeroPoint } from "../../pubUtils/timeUtil"; import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, AUCTION_SOURCE, MAIL_TYPE, CITY_STATUS, DEBUG_MAGIC_WORD, GUILD_POINT_WAYS, TASK_TYPE, AUCTION_TIME, CITY_ACTIVITY_DOOR, ABI_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, SHOP_REFRESH_TYPE, COUNTER } from "../../consts"; import { Record, UserGuildActivityRecModel } from "../../db/UserGuildActivityRec"; -import { GateMembersRec, CityParam, Member, WoodenHorse, RaceActivityRankParam } from "../../domain/battleField/guildActivity"; +import { GateMembersRec, CityParam, WoodenHorse, RaceActivityRankParam } from "../../domain/battleField/guildActivity"; import { DicGuildActivity } from "../../pubUtils/dictionary/DicGuildActivity"; import { getAllServers, getRoleOnlineInfo } from "../redisService"; import { SimpleGuildRankParam, SimpleRoleRankParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank"; @@ -462,7 +462,6 @@ export async function cityActivitySettleReward(cityId: number, serverId: number) let members = obj.getMembersOfGuild(guildCode); let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.CITY_ACTIVITY, index, { - memberCnt: members.length, members, isSuccess, isCompleted: true, rank: guildRank, damage: num, remainGateHp: gateHp, rewards: rewards.map(cur => cur.goods), @@ -660,8 +659,9 @@ export async function raceActivitySettleReward(guildCode: string, woodenHorse: W let { guildRank, myGuildRank } = await obj.getRanks(serverId, guildCode); let rank = myGuildRank?.rank||0; - let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY); - let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId, index }); + let joinIndex = getJoinIndex(); + console.log('##### raceActivitySettleReward', joinIndex, serverId, guildCode); + let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId, index: joinIndex }); await r.setRankWithGuildInfo2(guildCode, myGuildRank.num, myGuildRank.sortTime, myGuildRank.durability); let nextWeek = getTimeFun().getAfterDayWithHour(7); await r.setExpire(nextWeek); @@ -670,8 +670,7 @@ export async function raceActivitySettleReward(guildCode: string, woodenHorse: W let members = obj.getMembersOfGuild(guildCode); let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, rank); - let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, index, { - memberCnt: members.length, members, + let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, joinIndex, { isSuccess, isCompleted: true, rank, rewards: rewards.map(cur => cur.goods), woodenHorse: woodenHorse.getTreatTime(), @@ -860,4 +859,11 @@ export function getDeclareIndex() { let obj = getCityActivityObj(); if(obj.guildActivityStatus == GUILD_ACTIVITY_STATUS.START) return index; return index + 1; +} + +export function getJoinIndex() { + let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY); + let obj = getRaceActivityObj(); + if(obj.status == GUILD_ACTIVITY_STATUS.START) return index; + return index + 1; } \ No newline at end of file diff --git a/game-server/app/services/guildActivity/raceActivityObj.ts b/game-server/app/services/guildActivity/raceActivityObj.ts index 99c64a65d..779f882f1 100644 --- a/game-server/app/services/guildActivity/raceActivityObj.ts +++ b/game-server/app/services/guildActivity/raceActivityObj.ts @@ -6,13 +6,13 @@ import { RewardInter } from "../../pubUtils/interface"; import { getRaceEventItems, gameData } from "../../pubUtils/data"; import { GuildModel } from "../../db/Guild"; import { sendSingleRaceActEndMsg } from "./guildActivityService"; -import { REDIS_KEY, RACE_EVENT_TYPE, RACE_EVENT_EFFECT_TYPE, RACE_EVENT, STATUS, RACE_ACTIVITY_STATUS, PUSH_ROUTE, GUILD_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../consts"; +import { REDIS_KEY, RACE_EVENT_TYPE, RACE_EVENT_EFFECT_TYPE, RACE_EVENT, STATUS, PUSH_ROUTE, GUILD_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../consts"; import { getRandEelm, sortArrRandom, resResult, getRandResultByMember } from "../../pubUtils/util"; import { sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToUserWithSuc } from "../pushService"; // 粮草先行 export class RaceActivityObject { - public status = RACE_ACTIVITY_STATUS.WAITING; // 活动状态 0-未开始 1-已开始 2-已结束 + public status = GUILD_ACTIVITY_STATUS.WAITING; // 活动状态 0-未开始 1-已开始 2-已结束 private allStartTime = 0; // 开启时间,每天晚上8点 public guildList: Array<{ serverId: number, guildCode: string }> = []; // 所有军团 private members: Map> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}] @@ -88,7 +88,7 @@ export class RaceActivityObject { let member = woodenHorse.joinMember(roleId, roleName, sid, code) this.pushMember(guildCode, roleId, job, code); - if(this.status == RACE_ACTIVITY_STATUS.START) { + if(this.status == GUILD_ACTIVITY_STATUS.START) { this.sendRandItemsToMembers([member], woodenHorse, woodenHorse.remainItems); this.woodenHorseStartRace(woodenHorse); } @@ -150,7 +150,7 @@ export class RaceActivityObject { // 定时任务到,开始比赛,设置开始赛道,发放初始道具 public startRace() { - this.status = RACE_ACTIVITY_STATUS.START; + this.status = GUILD_ACTIVITY_STATUS.START; if(this.allStartTime == 0) this.allStartTime = Date.now(); let guildCodes = new Array(); for(let [code, woodenHorse] of this.woodenHorses) { @@ -163,7 +163,7 @@ export class RaceActivityObject { } public stopRace() { - this.status = RACE_ACTIVITY_STATUS.END; + this.status = GUILD_ACTIVITY_STATUS.END; for(let [_, woodenHorse] of this.woodenHorses) { woodenHorse.stopRace(); } diff --git a/shared/db/GuildActivityRec.ts b/shared/db/GuildActivityRec.ts index b2a814fab..68151002c 100644 --- a/shared/db/GuildActivityRec.ts +++ b/shared/db/GuildActivityRec.ts @@ -6,6 +6,7 @@ import { Member, WoodenHorse, Event } from '../domain/battleField/guildActivity' @index({ code: 1 }) +@index({ guildCode: 1, aid: 1, index: 1, status: 1 }) export default class GuildActivityRecord extends BaseModel { @prop({ required: true }) @@ -40,7 +41,7 @@ export default class GuildActivityRecord extends BaseModel { @prop({ required: true, type: Member, default: [], _id: false }) members: Member[]; // 参与活动的团员的roleId列表 - + @prop({ required: true, default: 0 }) memberCnt: number; // 参加的团员的数量 @@ -86,14 +87,14 @@ export default class GuildActivityRecord extends BaseModel { public static async updateInfo(guildCode: string, aid: number, index: number, update: GuildActivityRecordUpdateParam) { let rec: GuildActivityRecordType = await GuildActivityRecordModel.findOneAndUpdate( { guildCode, aid, index, status: 1 }, - { $set: update }, { new: true }).lean(); + { $set: update }, { new: true, upsert: true }).lean(); return rec; } public static async pushEvent(guildCode: string, aid: number, index: number, event: Event) { let rec: GuildActivityRecordType = await GuildActivityRecordModel.findOneAndUpdate( { guildCode, index, aid, status: 1 }, - { $push: { events: event } }, { new: true }).lean(); + { $push: { events: event } }, { new: true, upsert: true }).lean(); return rec; }