军团活动:诸侯混战露出的接口
This commit is contained in:
@@ -20,6 +20,7 @@ export const CHANNEL_PREFIX = {
|
||||
WORLD: 'world',
|
||||
GUILD: 'guild',
|
||||
TEAM: 'com_btl_team',
|
||||
CITY: 'city', // 军团活动,诸侯混战,按城池分channel
|
||||
}
|
||||
|
||||
// 消息来源
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: '数据表未找到' },
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user