From c896b271314bf7c7f71a63ab61c632700058b752 Mon Sep 17 00:00:00 2001 From: luying Date: Tue, 28 Jun 2022 22:01:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=9B=E5=9B=A2=E6=B4=BB=E5=8A=A8=EF=BC=9A?= =?UTF-8?q?=E8=AF=B8=E4=BE=AF=E6=B7=B7=E6=88=98=E8=87=AA=E5=8A=A8=E5=AE=A3?= =?UTF-8?q?=E6=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/servers/gm/handler/gmHandler.ts | 2 + .../guild/handler/cityActivityHandler.ts | 24 ++++----- .../guildActivity/guildActivityService.ts | 42 ++++++++++++--- shared/db/GuildActivityCity.ts | 21 +++----- shared/db/GuildActivityCityDeclare.ts | 53 +++++++++++++++++++ shared/pubUtils/data.ts | 3 +- shared/pubUtils/dictionary/DicCityActivity.ts | 3 ++ 7 files changed, 114 insertions(+), 34 deletions(-) create mode 100644 shared/db/GuildActivityCityDeclare.ts diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index 0e2d25496..7199444fc 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -20,6 +20,7 @@ import { SurveyModel, SurveyUpdate } from '../../../db/Survery'; import { getSurvey } from '../../../services/gmService'; import { sendMessageToAllWithSuc } from '../../../services/pushService'; import { sendMailByContent, sendMailsByGmMail } from '../../../services/mailService'; +import { GuildActivityCityDeclareModel } from '../../../db/GuildActivityCityDeclare'; let timer: NodeJS.Timer; export default function (app: Application) { return new GmHandler(app); @@ -317,6 +318,7 @@ export class GmHandler { // 清空旧数据 if (day <= 2) { await GuildActivityCityModel.clearGuardAndStartNext(); + await GuildActivityCityDeclareModel.clearDeclare(); } if(aid != 0) await delGuildActivityRank(aid); await GuildActivityRecordModel.updateTodayInfo({ status: 2 }); diff --git a/game-server/app/servers/guild/handler/cityActivityHandler.ts b/game-server/app/servers/guild/handler/cityActivityHandler.ts index 5855705c8..99584a354 100644 --- a/game-server/app/servers/guild/handler/cityActivityHandler.ts +++ b/game-server/app/servers/guild/handler/cityActivityHandler.ts @@ -1,7 +1,7 @@ import { Application, ChannelService, BackendSession, pinus, HandlerService, } from "pinus"; import { GUILD_ACTIVITY_TYPE, STATUS, REDIS_KEY, GUILD_POINT_WAYS, CITY_STATUS, TASK_TYPE, ITEM_CHANGE_REASON, PUSH_ROUTE, GUILD_ACTIVITY_STATUS } from "../../../consts"; import { resResult } from "../../../pubUtils/util"; -import { getGuildActivityStatus, getCityActivityObj, getCityStatus as pubGetCityStatus, getCities, getCityActivityRank, sendSingleCityActEndMsg, getPreDayActiveData, sendGuildCityDeclare } from "../../../services/guildActivity/guildActivityService"; +import { getGuildActivityStatus, getCityActivityObj, getCityStatus as pubGetCityStatus, getCities, getCityActivityRank, sendSingleCityActEndMsg, getPreDayActiveData, sendGuildCityDeclare, declareCity, autoDeclareMyCity } from "../../../services/guildActivity/guildActivityService"; import { GuildActivityCityModel } from "../../../db/GuildActivityCity"; import { gameData } from "../../../pubUtils/data"; import { UserGuildActivityRecModel } from "../../../db/UserGuildActivityRec"; @@ -18,6 +18,7 @@ import { dispatch } from "../../../pubUtils/dispatcher"; import { ServerRecordModel } from "../../../db/ServerRecords"; import { sendMessageToCityWithSuc } from "../../../services/pushService"; import { isDebugTime } from "../../../pubUtils/sdkUtil"; +import { GuildActivityCityDeclareModel } from "../../../db/GuildActivityCityDeclare"; export default function (app: Application) { new HandlerService(app, {}); @@ -34,15 +35,17 @@ export class CityActivityHandler { // 进入诸侯混战 async getCityActivity(msg: {}, session: BackendSession) { - - // const roleId = session.get('roleId'); + 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); - + + if(statusResult.status == GUILD_ACTIVITY_STATUS.START) { + await autoDeclareMyCity(serverId, roleId, guildCode); + } const dbCities = await GuildActivityCityModel.getAllCities(serverId); let cities = getCities(guildCode, dbCities); @@ -108,7 +111,7 @@ export class CityActivityHandler { // 宣战 async declareCity(msg: { cityId: number }, session: BackendSession) { - // const roleId = session.get('roleId'); + const roleId = session.get('roleId'); // const roleName = session.get('roleName'); const serverId = session.get('serverId'); const guildCode = session.get('guildCode'); @@ -117,18 +120,15 @@ export class CityActivityHandler { let dicCity = gameData.cityActivity.get(cityId); if (dicCity.preCity.length > 0) return resResult(STATUS.CAN_NOT_DECLARE); - let checkResult = await GuildActivityCityModel.checkDeclartion(serverId, guildCode); + let checkResult = await GuildActivityCityDeclareModel.checkDeclartion(serverId, guildCode); if (!!checkResult) return resResult(STATUS.HAS_DECLARED); let curCity = await GuildActivityCityModel.getCity(serverId, cityId); if (curCity && curCity.guardGuildCode) { return resResult(STATUS.CITY_IS_GUARD); } - let rec = await GuildActivityCityModel.declare(serverId, cityId, guildCode); - await sendGuildCityDeclare(cityId, guildCode, rec.declareCount); - - let obj = getCityActivityObj(); - obj.pushGuild(guildCode, serverId, cityId); + let declareResult = await declareCity(serverId, roleId, guildCode, cityId, false); + if(!declareResult) return resResult(STATUS.HAS_DECLARED); const dbCities = await GuildActivityCityModel.getAllCities(serverId); let cities = getCities(guildCode, dbCities); @@ -148,7 +148,7 @@ export class CityActivityHandler { if (!guildCode) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); - let checkResult = await GuildActivityCityModel.checkDeclartion(serverId, guildCode); + let checkResult = await GuildActivityCityDeclareModel.checkDeclartion(serverId, guildCode); if (!checkResult) return resResult(STATUS.HAS_NOT_DECLARED); let obj = getCityActivityObj(); diff --git a/game-server/app/services/guildActivity/guildActivityService.ts b/game-server/app/services/guildActivity/guildActivityService.ts index 2e08fc900..f87df0ccf 100644 --- a/game-server/app/services/guildActivity/guildActivityService.ts +++ b/game-server/app/services/guildActivity/guildActivityService.ts @@ -2,8 +2,8 @@ import { ServerlistModel, ServerlistType } from "../../db/Serverlist"; import { RoleModel } from "../../db/Role"; import { GUILDACTIVITY } from "../../pubUtils/dicParam"; import { gameData, getGuildAuctionRewards, getCityActivityRewards } from "../../pubUtils/data"; -import { getCurDay, nowSeconds, getTimeFun } 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 } from "../../consts"; +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 } from "../../consts"; import { Record, UserGuildActivityRecModel } from "../../db/UserGuildActivityRec"; import { GateMembersRec, CityParam, Member, WoodenHorse } from "../../domain/battleField/guildActivity"; import { DicGuildActivity } from "../../pubUtils/dictionary/DicGuildActivity"; @@ -11,7 +11,7 @@ import { getAllServers, getRoleOnlineInfo } from "../redisService"; import { SimpleGuildRankParam, SimpleRoleRankParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank"; import { pinus } from "pinus"; import { GuildActivityRecordModel } from "../../db/GuildActivityRec"; -import { genAuction } from "../auctionService"; +import { genAuction, guildAuctionPreview } from "../auctionService"; import { sendMailByContent } from "../mailService"; import { GuildActivityCityType, GuildActivityCityModel } from "../../db/GuildActivityCity"; import { DicCityActivity } from "../../pubUtils/dictionary/DicCityActivity"; @@ -27,6 +27,8 @@ import { Attack } from "../../domain/battleField/pvp"; import { getHonourObject } from "../role/rewardService"; import { sendMessageToCityWithSuc, sendMessageToGuildWithSuc, sendMessageToServerWithSuc } from "../pushService"; import { saveGuildGateHpLog } from "../../pubUtils/logUtil"; +import { GuildActivityCityDeclareModel } from "../../db/GuildActivityCityDeclare"; +import { getRandSingleEelm } from "../../pubUtils/util"; let gateActivityObj: GateActivityObject; let cityActivityObj: CityActivityObject; @@ -447,10 +449,10 @@ export async function cityActivitySettleReward(cityId: number, serverId: number) for (let { rank: guildRank, code: guildCode, name, num } of ranks) { if (guildRank == 1) { if (isSuccess) { - console.log(dicCity) - await GuildActivityCityModel.guard(serverId, cityId, dicCity?.nextCity, guildCode, name); // 占领 + await GuildActivityCityModel.guard(serverId, cityId, guildCode, name); // 占领 + await declareCity(serverId, "", guildCode, dicCity.nextCity, true); } else { - await GuildActivityCityModel.guard(serverId, cityId, 0, "", ""); // 无人能占领 + await GuildActivityCityModel.guard(serverId, cityId, "", ""); // 无人能占领 } } let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY, guildRank, cityId); @@ -499,6 +501,7 @@ export async function cityActivitySettleReward(cityId: number, serverId: number) */ export async function autoDeclare(serverId: number) { await GuildActivityCityModel.clearGuardAndStartNext(serverId); + await GuildActivityCityDeclareModel.clearDeclare(serverId); for(let [ cityId ] of gameData.cityActivity) { let msg = { cityId, declareGuildCode: "", declareCount: 0 }; await sendMessageToCityWithSuc(cityId, PUSH_ROUTE.GUILD_CITY_DECLARE, msg); @@ -813,4 +816,31 @@ export async function getCityActivityGateHp(serverId: number, cityId: number) { gateHp = dicCityActivity.hp; } return gateHp; +} + +export async function declareCity(serverId: number, roleId: string, guildCode: string, cityId: number, isAutoDeclare: boolean) { + let declareTime = Date.now(); + let declareInfo = await GuildActivityCityDeclareModel.declareIfNot(serverId, guildCode, cityId, roleId, declareTime, isAutoDeclare); + if(!!declareInfo && declareInfo.declareTime == declareTime) { // 确实没有人宣战过,自己是第一个 + let cityRec = await GuildActivityCityModel.declare(serverId, cityId, guildCode); + await sendGuildCityDeclare(cityId, guildCode, cityRec.declareCount); + return true; + } + return false; +} + +// 非军团长的团员自动宣战 +export async function autoDeclareMyCity(serverId: number, roleId: string, guildCode: string) { + let checkResult = await GuildActivityCityDeclareModel.checkDeclartion(serverId, guildCode); + if(checkResult) return false + + let cityIds = gameData.juniorCities; + let cities = await GuildActivityCityModel.findMinDeclareCountCity(serverId, cityIds); + let notDeclaredCitites = cityIds.filter(curCityId => { + return cities.findIndex(city => city.cityId == curCityId) == -1; + }); + let cityId = notDeclaredCitites.length > 0? getRandSingleEelm(notDeclaredCitites): cities[0].cityId; + if(!cityId) return false; + + return declareCity(serverId, roleId, guildCode, cityId, true); } \ No newline at end of file diff --git a/shared/db/GuildActivityCity.ts b/shared/db/GuildActivityCity.ts index dbb19b87d..446c7cc3a 100644 --- a/shared/db/GuildActivityCity.ts +++ b/shared/db/GuildActivityCity.ts @@ -35,19 +35,17 @@ export default class GuildActivityCity extends BaseModel { return rec; } + public static async findMinDeclareCountCity(serverId: number, cityIds: number[]) { + let rec: GuildActivityCityType[] = await GuildActivityCityModel.find({ serverId, cityId: { $in: cityIds }, status: 1 }).sort({ declareCount: 1 }).lean(); + return rec; + } + public static async getCity(serverId: number, cityId: number) { let rec: GuildActivityCityType = await GuildActivityCityModel.findOne({ serverId, cityId, status: 1}).lean(); return rec; } - // 检查是否宣战过 - public static async checkDeclartion(serverId: number, guildCode: string) { - let rec: GuildActivityCityType = await GuildActivityCityModel.findOne( - { serverId, status: 1, declareGuilds: { $in: [guildCode]}}).lean(); - - return rec; - } // 宣言 public static async declare(serverId: number, cityId: number, guildCode: string) { @@ -60,18 +58,11 @@ export default class GuildActivityCity extends BaseModel { } // 占领 - public static async guard(serverId: number, cityId: number, nextCityId: number, guildCode: string, guildName: string) { + public static async guard(serverId: number, cityId: number, guildCode: string, guildName: string) { let rec: GuildActivityCityType = await GuildActivityCityModel.findOneAndUpdate( { serverId, cityId, status: 1 }, { $set: { guardGuildCode: guildCode, guardGuildName: guildName, guardTime: new Date()} }, { new: true }).lean(); - - if(nextCityId) { - await GuildActivityCityModel.findOneAndUpdate( - { serverId, cityId: nextCityId, status: 2 }, - { $push: { declareGuilds: guildCode }, $inc: {declareCount: 1 } }, - {new: true, upsert: true}).lean(); - } return rec; } diff --git a/shared/db/GuildActivityCityDeclare.ts b/shared/db/GuildActivityCityDeclare.ts new file mode 100644 index 000000000..f6b3931d6 --- /dev/null +++ b/shared/db/GuildActivityCityDeclare.ts @@ -0,0 +1,53 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +@index({ serverId: 1, cityId: 1, createdAt: 1 }) +export default class GuildActivityCityDeclare extends BaseModel { + + @prop({ required: true }) + serverId: number; // 分服 + + @prop({ required: true }) + cityId: number; // 城池id + + @prop({ required: true }) + guildCode: string; // 宣战的公会的code + + @prop({ required: true }) + declareTime: number; // 宣战时间(当前) + + @prop({ required: true }) + declareMember: string; // 触发宣战的人 + + @prop({ required: true }) + isAutoDeclare: boolean; // 是否是自动宣战 + + @prop({ required: true }) + status: number; // 状态 1-当前 0-失效,当活动结束时定时任务设为0 + + // 宣战 + public static async declareIfNot(serverId: number, guildCode: string, cityId: number, roleId: string, declareTime: number, isAutoDeclare: boolean) { + let rec: GuildActivityCityDeclareType = await GuildActivityCityDeclareModel.findOneAndUpdate({ serverId, guildCode, status: 1 }, { $setOnInsert: { cityId, declareMember: roleId, declareTime, isAutoDeclare } }, { new: true, upsert: true }).lean(); + return rec; + } + + // 检查是否宣战过 + public static async checkDeclartion(serverId: number, guildCode: string) { + let rec = await GuildActivityCityDeclareModel.exists({ serverId, status: 1, guildCode}); + return rec; + } + + // 清空今天的宣战 + public static async clearDeclare(serverId?: number) { + if(serverId) { + await GuildActivityCityDeclareModel.updateMany({ serverId, status: 1}, { status: 0 }); + } else { + await GuildActivityCityDeclareModel.updateMany({ status: 1}, { status: 0 }); + } + } +} + +export const GuildActivityCityDeclareModel = getModelForClass(GuildActivityCityDeclare); + +export interface GuildActivityCityDeclareType extends Pick, keyof GuildActivityCityDeclare> { }; +export type GuildActivityCityDeclareUpdateParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index eabbcb0c0..2e317ca0c 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -52,7 +52,7 @@ import { dicGuildActivity, DicGuildActivity, loadGuildActivity } from './diction import { dicGateActivityPoint, loadGateActivityPoint } from './dictionary/DicGateActivityPoint'; import { dicGuildAuction, loadGuildAuction } from './dictionary/DicGuildAuction'; import { getCurDay } from "./timeUtil"; -import { dicCityActivity, loadCityActivity } from "./dictionary/DicCityActivity"; +import { dicCityActivity, dicJuniorCities, loadCityActivity } from "./dictionary/DicCityActivity"; import { dicChatAccuse, loadChatAccuse } from "./dictionary/DicChatAccuse"; import { dicCityActivityReward, loadCityActivityReward } from "./dictionary/DicCityActivityReward"; import { dicRaceActivity, dicRaceTypes, loadRaceActivity } from './dictionary/DicRaceActivity'; @@ -189,6 +189,7 @@ export const gameData = { gateActivityPoint: dicGateActivityPoint, guildAuction: dicGuildAuction, cityActivity: dicCityActivity, + juniorCities: dicJuniorCities, chatAccuse: dicChatAccuse, cityActivityReward: dicCityActivityReward, raceActivityEvents: dicRaceActivity, diff --git a/shared/pubUtils/dictionary/DicCityActivity.ts b/shared/pubUtils/dictionary/DicCityActivity.ts index 0b4322dc8..ca1ee20ec 100644 --- a/shared/pubUtils/dictionary/DicCityActivity.ts +++ b/shared/pubUtils/dictionary/DicCityActivity.ts @@ -26,8 +26,10 @@ export interface DicCityActivity { readonly atkTemplate: number; } +export const dicJuniorCities: number[] = []; export const dicCityActivity = new Map(); export function loadCityActivity() { + dicJuniorCities.splice(0, dicJuniorCities.length); dicCityActivity.clear(); let arr = readFileAndParse(FILENAME.DIC_CITY_ACTIVITY); @@ -35,6 +37,7 @@ export function loadCityActivity() { o.preCity = parseNumberList(o.preCity); o.week = parseNumberList(o.week); dicCityActivity.set( o.id, o ); + if(o.type == 1) dicJuniorCities.push(o.id); }); arr = undefined; } \ No newline at end of file