军团活动:诸侯混战自动宣战

This commit is contained in:
luying
2022-06-28 22:01:49 +08:00
parent 38621fb153
commit c896b27131
7 changed files with 114 additions and 34 deletions

View File

@@ -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 });

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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<DocumentType<GuildActivityCityDeclare>, keyof GuildActivityCityDeclare> { };
export type GuildActivityCityDeclareUpdateParam = Partial<GuildActivityCityDeclareType>; // 将所有字段变成可选项

View File

@@ -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,

View File

@@ -26,8 +26,10 @@ export interface DicCityActivity {
readonly atkTemplate: number;
}
export const dicJuniorCities: number[] = [];
export const dicCityActivity = new Map<number, DicCityActivity>();
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;
}