军团活动:诸侯混战露出的接口

This commit is contained in:
luying
2021-03-22 20:51:59 +08:00
parent a56a6cf2f3
commit ecb4b87abc
14 changed files with 550 additions and 87 deletions

View File

@@ -20,6 +20,7 @@ export const CHANNEL_PREFIX = {
WORLD: 'world',
GUILD: 'guild',
TEAM: 'com_btl_team',
CITY: 'city', // 军团活动诸侯混战按城池分channel
}
// 消息来源

View File

@@ -232,8 +232,11 @@ export const REDIS_KEY = {
DB_GAME: 'db_game', // 服务器列表
ONLINE_USERS: 'onlineUsers', // 在线用户情况
CHANNEL_SERVERS: 'chat:channelServers', // 渠道对应的 chat 服务器 Id,
USER_GATE_ACTIVITY: 'usrGateAct',
GATE_ACTIVITY: 'gateAct',
USER_GATE_ACTIVITY: 'usrGateAct', // 蛮夷入侵玩家排行
GATE_ACTIVITY: 'gateAct', // 蛮夷入侵军团排行
USER_CITY_ACTIVITY: 'usrCityAct', // 诸侯混战玩家排行
CITY_ACTIVITY: 'cityAct', // 诸侯混战军团排行
}
// 各排行榜对应hash的key

View File

@@ -34,6 +34,7 @@ export const STATUS = {
BATTLE_HERO_NOT_FOUND: { code: 20006, simStr: '使用的武将不存在' },
BATTLE_CONSUMES_NOT_ENOUGH: { code: 20007, simStr: '道具不足' },
BATTLE_END_WRONG_TYPE: { code: 20008, simStr: '此类型无法使用通用结算' },
BATTLE_GOLD_NOT_ENOUGH: { code: 20009, simStr: '元宝不足' },
// 主线 20100 - 20199
BATTLE_INFO_VALIDATE_ERR: { code: 20101, simStr: '关卡信息不同' },
@@ -202,6 +203,8 @@ export const STATUS = {
GUILD_ACTIVITY_NOT_OPEN: { code: 21100, simStr: '活动未开放' },
GATE_HP_IS_ZERO: { code: 21101, simStr: '城门已被击破' },
CHALLENGE_CNT_NOT_ENOUGH: { code: 21102, simStr: '挑战次数不足' },
HAS_DECLARED: { code: 21103, simStr: '已宣战过' },
CHALLENGE_TIME_NOT_REACH: { code: 21104, simStr: '挑战冷却中' },
// 通用 30000 - 30099
DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' },

View File

@@ -32,11 +32,20 @@ export default class GuildActivityCity extends BaseModel {
return rec;
}
// 检查是否宣战过
public static async checkDeclartion(serverId: number, guildCode: string) {
let today = getTodayZeroDate();
let rec: GuildActivityCityType = await GuildActivityCityModel.findOne(
{ serverId, createdAt: { $gte: today }, $in: { declareGuilds: [guildCode]}}).lean();
return rec;
}
// 每天宣战一次
public static async declare(serverId: number, cityId: number, guildCode: string) {
let today = getTodayZeroDate();
let rec: GuildActivityCityType = await GuildActivityCityModel.findOneAndUpdate(
{ serverId, cityId, createdAt: { $gte: today }, declareGuilds: { $nin: [guildCode] }},
{ serverId, cityId, createdAt: { $gte: today } },
{ $setOnInsert: { cityId }, $push: { declareGuilds: guildCode }, $inc: {declareCount: 1 } },
{new: true, upsert: true}).lean();

View File

@@ -18,6 +18,17 @@ export class Record {
}
export class DamageRecord {
@prop({ required: true })
round: number; // 第几回合
@prop({ required: true })
hid: number; // 造成伤害的武将
@prop({ required: true })
damage: number; // 伤害
}
@index({ code: 1 })
export default class UserGuildActivityRec extends BaseModel {
@@ -54,17 +65,26 @@ export default class UserGuildActivityRec extends BaseModel {
@prop({ required: true, default: 0 })
challengeCnt: number; // 向上累加的挑战次数
// 南蛮入侵字段
@prop({ required: true, type: Number })
heroes: number[]; // 使用的武将
heroes: number[]; // 南蛮&诸侯混战 使用的武将
@prop({ required: true })
score: number; // 个人总军功
score: number; // 个人总军功/个人总伤害
// 南蛮入侵字段
@prop({ required: true, type: Record, _id: false })
record: Record[]; // 个人总军功
// 诸侯混战字段
@prop({ required: true, default: 0 })
challengeTime: number; // cd结束时间
@prop({ required: true, type: DamageRecord, _id: false })
damageRecord: DamageRecord[]; // 城门伤害记录
@prop({ required: true, default: 0 })
cityId: number; // 挑战城池
// 每天一条记录
public static async getRecord(roleId: string, roleName: string, guildCode: string, serverId: number, sourceCode: string, aid: number) {
let today = getTodayZeroDate();
@@ -80,6 +100,14 @@ export default class UserGuildActivityRec extends BaseModel {
return rec;
}
public static async findByRoleId(roleId: string, aid: number) {
let today = getTodayZeroDate();
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOne({ roleId, aid, createdAt: { $gte: today }}).lean();
return rec;
}
public static async incChallengeCnt(code: string, heroes: number[], inc: number = 1 ) {
let rec = await UserGuildActivityRecModel.findOneAndUpdate( { code}, { $push: { heroes: { $each: heroes}}, $inc: { challengeCnt: inc }}, {new: true}).lean();
return rec;
@@ -94,6 +122,15 @@ export default class UserGuildActivityRec extends BaseModel {
return rec;
}
public static async pushCityRecord(code: string, damageRecord: DamageRecord) {
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate(
{ code },
{ $push: { damageRecord }},
{ new: true }
).lean();
return rec;
}
public static async updateInfo(code: string, update: UserGuildActivityRecUpdateParam) {
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate({ code }, { $set: update }, { new: true }).lean();
return rec;

View File

@@ -16,7 +16,7 @@ export class GateMembersRec {
export class GateActivityObject {
private gateHp: Map<string, number> = new Map(); // 城门血条,每个军团有一条血条 guildCode => hp
private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [roleId]
private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
private membersRecord: Map<string, GateMembersRec> = new Map(); // 每个成员的回合数和敌军数,防刷 recCode => GateMembersRec
private guilds: Map<number, string[]> = new Map(); // 参加的所有军团 server => [guildCode]
@@ -89,6 +89,73 @@ export class GateActivityObject {
}
}
// 军团诸侯混战等数据
export class CityActivityObject {
private gateHp: Map<string, number> = new Map(); // 城门血条每个cityId有一条血条 serverId&cityId => gateHp
private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
private cities: Map<string, string[]> = new Map(); // 各个城池参与的军团 serverId&cityId => [guildCode]
private guilds: Map<string, number> = new Map(); // 军团所在的城池 guildCode => cityId
private historyCity: Map<string, number> = new Map(); // 获取自己打开过的城池的页面 roleId => cityId
private getKey(serverId: number, cityId: number) {
return `${serverId}_${cityId}`;
}
public getObj( serverId: number, cityId: number, guildCode: string) {
let key = this.getKey(serverId, cityId);
return {
gateHp: this.gateHp.get(key),
members: this.members.get(guildCode),
city: this.cities.get(key),
guild: this.guilds.get(guildCode)
}
}
public getGateHpAndInc(serverId: number, cityId: number, maxHp: number, inc: number = 0) {
let key = this.getKey(serverId, cityId);
let gateHp = this.gateHp.get(key);
if(!this.gateHp.has(key)) {
gateHp = maxHp;
}
if(inc != 0) {
gateHp += inc;
this.gateHp.set(key, gateHp);
}
if(gateHp <= 0) gateHp = 0;
return gateHp
}
public getHistoryCity(roleId: string) {
return this.historyCity.get(roleId)
}
public setHistoryCity(roleId: string, cityId: number) {
return this.historyCity.set(roleId, cityId);
}
public pushMembers(guildCode: string, roleId: string, job: number) {
if(this.members.has(guildCode)) {
this.members.get(guildCode).push({ roleId, job });
} else {
let arr = new Array<string>();
arr.push(roleId);
this.members.set(guildCode, [{ roleId, job }]);
}
}
public pushGuild(guildCode: string, serverId: number, cityId: number) {
let key = this.getKey(serverId, cityId);
if(!this.cities.has(key)) {
this.cities.set(key, [guildCode]);
} else {
this.cities.get(key).push(guildCode);
}
this.guilds.set(guildCode, cityId);
}
}
export interface GuildGateRankParam {
guildRank: SimpleGuildRankParam[],
myGuildRank: SimpleGuildRankParam,

View File

@@ -2,6 +2,7 @@ import { TIME_FORMAT } from '../consts';
const PER_SECOND = 1 * 1000;
const PER_DAY = 24 * 60 * 60;
const PER_MINUTE = 60;
const PER_HOUR = 60 * 60;
export function getSeconds(time: Date) {
@@ -47,6 +48,10 @@ export function getBeforeHourSeconds(hour: number) {
return time;
}
export function getBeforeMinuteSeconds(minute: number) {
let time = nowSeconds() - minute * PER_MINUTE;
return time;
}
export function getCurWeekDate(day: number, hour: number) {
return getWeekDate(new Date(), day, hour);