diff --git a/game-server/app/servers/guild/handler/cityActivityHandler.ts b/game-server/app/servers/guild/handler/cityActivityHandler.ts new file mode 100644 index 000000000..2364d226f --- /dev/null +++ b/game-server/app/servers/guild/handler/cityActivityHandler.ts @@ -0,0 +1,33 @@ +import { Application, ChannelService, BackendSession } from "pinus"; +import { GUILD_ACTIVITY_TYPE, STATUS } from "../../../consts"; +import { resResult } from "../../../pubUtils/util"; +import { getGuildActivityStatus } from "../../../services/guildActivityService"; + +export default function (app: Application) { + return new CityActivityHandler(app); +} + +export class CityActivityHandler { + channelService: ChannelService; + constructor(private app: Application) { + this.channelService = app.get('channelService'); + } + + private aid = GUILD_ACTIVITY_TYPE.CITY_ACTIVITY; // 蛮夷入侵id + + // 进入诸侯混战 + async getCityActivity(msg: {}, session: BackendSession) { + + const roleId = session.get('roleId'); + const roleName = session.get('roleName'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + let statusResult = getGuildActivityStatus(this.aid); + if(!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); + + return resResult(STATUS.SUCCESS, { + ...statusResult, + }); + } +} \ No newline at end of file diff --git a/game-server/app/servers/guild/handler/gateActivityHandler.ts b/game-server/app/servers/guild/handler/gateActivityHandler.ts index 32ce1eb0c..cc059635e 100644 --- a/game-server/app/servers/guild/handler/gateActivityHandler.ts +++ b/game-server/app/servers/guild/handler/gateActivityHandler.ts @@ -1,5 +1,5 @@ import { Application, BackendSession, ChannelService, pinus } from "pinus"; -import { setMedianCe, getMedianCe, getGuildActivityStatus, getRecordScore, getGuildActivityObj, getGuildActivityRank, sendSingleGuildGateActEndMsg, sendGuildActEndMsg } from "../../../services/guildActivityService"; +import { setMedianCe, getMedianCe, getGuildActivityStatus, getRecordScore, getGuildActivityObj, getGuildActivityRank, sendSingleGuildGateActEndMsg, sendGuildActEndMsg, participants } from "../../../services/guildActivityService"; import { resResult } from "../../../pubUtils/util"; import { STATUS, GUILD_ACTIVITY_TYPE, GUILD_POINT_WAYS, ENEMIES_TYPE, GET_POINT_WAYS } from "../../../consts"; import { GameModel } from "../../../db/Game"; @@ -17,6 +17,7 @@ import { addActive } from "../../../services/guildService"; import { gameData } from "../../../pubUtils/data"; import { getGuildChannelSid } from "../../../services/chatService"; import { guildActivityStart } from "../../../services/timeTaskService"; +import { UserGuildModel } from "../../../db/UserGuild"; export default function (app: Application) { return new GateActivityHandler(app); @@ -77,6 +78,8 @@ export class GateActivityHandler { // TODO 测试完成后去掉这条判断 // if(!statusResult.isOpen) return resResult(STATUS.GUILD_ACTIVITY_NOT_OPEN); + let userGuild = await UserGuildModel.getMyGuild(roleId, 'job'); + let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid); if(!guildActivityRec) return resResult(STATUS.INTERNAL_ERR); @@ -89,7 +92,7 @@ export class GateActivityHandler { let { code, challengeCnt } = myGuildActivityRec; // 更新公会参与的玩家 - obj.pushMembers(guildCode, serverId, roleId); + obj.pushMembers(guildCode, serverId, roleId, userGuild.job); // 返回当前军团总军功 let guildScore = await getRankScore(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode); @@ -281,11 +284,14 @@ export class GateActivityHandler { return resResult(STATUS.SUCCESS, res) } - async test(msg: { }, session: BackendSession) { + async test(msg: { sourceType: number, sourceCode: string }, session: BackendSession) { let guildCode = session.get('guildCode'); let serverId = session.get('serverId'); - await GuildActivityCityModel.declare(serverId, 1, guildCode); + // await GuildActivityCityModel.declare(serverId, 1, guildCode); + let {sourceType, sourceCode} = msg; + let result = await participants(guildCode, sourceType, sourceCode); + return result; // let result = await setMedianCe(); // return resResult(STATUS.SUCCESS, {result}); diff --git a/game-server/app/services/guildActivityService.ts b/game-server/app/services/guildActivityService.ts index a5e786a16..f64418435 100644 --- a/game-server/app/services/guildActivityService.ts +++ b/game-server/app/services/guildActivityService.ts @@ -9,7 +9,7 @@ import { Record, UserGuildActivityRecModel } from "../db/UserGuildActivityRec"; import { GateMembersRec, GateActivityObject } from "../domain/battleField/guildActivity"; import { DicGuildActivity } from "../pubUtils/dictionary/DicGuildActivity"; import { getUnionRank, getRank, getGuildKeyName, getMyUnionRank, getRankScore } from "./redisService"; -import { GuildModel } from "../db/Guild"; +import Guild, { GuildModel } from "../db/Guild"; import { SimpleGuildRankParam, SimpleRoleRankParam } from "../domain/rank"; import { getGuildChannelSid, getWorldChannelSid } from "./chatChannelService"; import { pinus } from "pinus"; @@ -234,7 +234,7 @@ export async function sendSingleGuildGateActEndMsg(guildCode: string, serverId: export async function gateActivitySettleReward(guildCode: string, serverId: number) { let obj = getGuildActivityObj(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY); let { gateHp, members } = obj.getObj(guildCode, serverId); - members = uniq(members); + members = uniq(members, cur => cur.roleId); let rank = await getMyUnionRank(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode); let guildScore = await getRankScore(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode); @@ -245,7 +245,8 @@ export async function gateActivitySettleReward(guildCode: string, serverId: numb isSuccess: gateHp > 0, isCompleted: true, rank, score: guildScore, remainGateHp: gateHp, - members, memberCnt: members.length, + members, memberCnt: members.length, + auctionType: AUCTION_SOURCE.GATE, rewards }); // 结算功勋等奖励 @@ -263,4 +264,17 @@ export async function gateActivitySettleReward(guildCode: string, serverId: numb await genAuction(guildCode, AUCTION_SOURCE.GATE, rec.code, serverId, rewards); obj.delGuildRecord(guildCode, serverId); +} + +/** + * 获取活动参加者 + * @param guildCode 军团code + * @param sourceType 拍卖类型 AUCTION_SOURCE + * @param sourceCode 活动唯一code + */ +export async function participants(guildCode: string, sourceType: number, sourceCode: string) { + let rec = await GuildActivityRecordModel.findBySourceCode(guildCode, sourceType, sourceCode); + if(!rec) return []; + + return rec.members||[]; } \ No newline at end of file diff --git a/game-server/app/util/routeUtil.ts b/game-server/app/util/routeUtil.ts index 2d81c58b9..56cc138ad 100644 --- a/game-server/app/util/routeUtil.ts +++ b/game-server/app/util/routeUtil.ts @@ -66,6 +66,11 @@ export function guild(session: Session, msg: any, app: Application, cb: (err: Er 'guild.gateActivityHandler.debugEndActivity' ].indexOf(arg.route) !== -1) { rid = session.get('guildCode'); + } else if (['guild.cityActivityHandler.getCityStatus' + ].indexOf(arg.route) !== -1) { + if (arg.body.cityId) { + rid = arg.body.cityId; + } } } } diff --git a/shared/db/GuildActivityCity.ts b/shared/db/GuildActivityCity.ts index 1bed1d02d..33f87fb42 100644 --- a/shared/db/GuildActivityCity.ts +++ b/shared/db/GuildActivityCity.ts @@ -2,7 +2,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; import { getTodayZeroDate } from '../pubUtils/timeUtil'; -@index({ code: 1 }) +@index({ serverId: 1, cityId: 1, createdAt: 1 }) export default class GuildActivityCity extends BaseModel { @prop({ required: true }) diff --git a/shared/db/GuildActivityRec.ts b/shared/db/GuildActivityRec.ts index a38350344..2c2498965 100644 --- a/shared/db/GuildActivityRec.ts +++ b/shared/db/GuildActivityRec.ts @@ -3,6 +3,7 @@ import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typ import { ItemReward } from '../domain/dbGeneral'; import { getTodayZeroDate } from '../pubUtils/timeUtil'; import { genCode } from '../pubUtils/util'; +import { Member } from '../domain/battleField/guildActivity' @index({ code: 1 }) @@ -20,6 +21,9 @@ export default class GuildActivityRecord extends BaseModel { @prop({ required: true }) aid: number; // 军团活动id + @prop({ required: true }) + auctionType: number; // 转为拍卖行的类型 + @prop({ required: true, default: false }) isSuccess: boolean; // 是否胜利 @@ -29,8 +33,8 @@ export default class GuildActivityRecord extends BaseModel { @prop({ required: true }) rank: number; // 最终排名 - @prop({ required: true, type: String, default: [] }) - members: string[]; // 参与活动的团员的roleId列表 + @prop({ required: true, type: Member, default: [], _id: false }) + members: Member[]; // 参与活动的团员的roleId列表 @prop({ required: true, default: 0 }) memberCnt: number; // 参加的团员的数量 @@ -83,6 +87,11 @@ export default class GuildActivityRecord extends BaseModel { { $set: update }, { new: true }).lean(); return rec; } + + public static async findBySourceCode(guildCode: string, sourceType: number, sourceCode: string) { + const rec = await GuildActivityRecordModel.findOne({ guildCode, auctionType: sourceType, code: sourceCode }).select('members').lean(); + return rec; + } } export const GuildActivityRecordModel = getModelForClass(GuildActivityRecord); diff --git a/shared/domain/battleField/guildActivity.ts b/shared/domain/battleField/guildActivity.ts index f385be73f..e3c9ce3ab 100644 --- a/shared/domain/battleField/guildActivity.ts +++ b/shared/domain/battleField/guildActivity.ts @@ -1,5 +1,6 @@ import { GUILDACTIVITY } from "../../pubUtils/dicParam"; import { SimpleGuildRankParam, SimpleRoleRankParam } from '../rank' +import { prop } from "@typegoose/typegoose"; export class GateMembersRec { roleId: string; @@ -14,7 +15,7 @@ export class GateMembersRec { export class GateActivityObject { private gateHp: Map = new Map(); // 城门血条,每个军团有一条血条 guildCode => hp - private members: Map> = new Map(); // 每个军团参与的成员 guildCode => [roleId] + private members: Map> = new Map(); // 每个军团参与的成员 guildCode => [roleId] private membersRecord: Map = new Map(); // 每个成员的回合数和敌军数,防刷 recCode => GateMembersRec private guilds: Map = new Map(); // 参加的所有军团 server => [guildCode] @@ -45,14 +46,14 @@ export class GateActivityObject { return this.guilds; } - public pushMembers(guildCode: string, serverId: number, roleId: string) { + public pushMembers(guildCode: string, serverId: number, roleId: string, job: number) { if(this.members.has(guildCode)) { - this.members.get(guildCode).push(roleId); + this.members.get(guildCode).push({ roleId, job }); } else { let arr = new Array(); arr.push(roleId); - this.members.set(guildCode, [roleId]); + this.members.set(guildCode, [{ roleId, job }]); } if(this.guilds.has(serverId)) { let arr = this.guilds.get(serverId); @@ -92,4 +93,11 @@ export interface GuildGateRankParam { myGuildRank: SimpleGuildRankParam, memberRank: SimpleRoleRankParam[], myMemberRank?: SimpleRoleRankParam +} + +export class Member { + @prop({required: true}) + roleId: string; // 玩家id + @prop({required: true}) + job: number; // 在军团的职位 } \ No newline at end of file