军团活动:诸侯混战自动宣战
This commit is contained in:
@@ -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 });
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
53
shared/db/GuildActivityCityDeclare.ts
Normal file
53
shared/db/GuildActivityCityDeclare.ts
Normal 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>; // 将所有字段变成可选项
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user