diff --git a/game-server/app/servers/guild/handler/raceActivityHandler.ts b/game-server/app/servers/guild/handler/raceActivityHandler.ts index c4ea56576..9cc63d3f4 100644 --- a/game-server/app/servers/guild/handler/raceActivityHandler.ts +++ b/game-server/app/servers/guild/handler/raceActivityHandler.ts @@ -1,6 +1,6 @@ import { Application, ChannelService, BackendSession, HandlerService, } from "pinus"; -import { GUILD_ACTIVITY_TYPE, STATUS, GUILD_ACTIVITY_STATUS, GUILD_POINT_WAYS, REDIS_KEY, TASK_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS } from "../../../consts"; -import { resResult } from "../../../pubUtils/util"; +import { GUILD_ACTIVITY_TYPE, STATUS, GUILD_ACTIVITY_STATUS, GUILD_POINT_WAYS, REDIS_KEY, TASK_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../../consts"; +import { genCode, resResult } from "../../../pubUtils/util"; import { getGuildActivityStatus, getRaceActivityObj, getWoodenHorseList, calWoodenHorseAndSend, raceActivitySettleReward } from "../../../services/guildActivity/guildActivityService"; import { UserGuildModel } from "../../../db/UserGuild"; import { GuildActivityRecordModel } from "../../../db/GuildActivityRec"; @@ -234,4 +234,27 @@ export class RaceActivityHandler { await raceActivitySettleReward(guildCode, woodenHorse) } } + + + // 加入木马 + async debugAddHorse(msg: { magicWord: string, memberCnt: number }, session: BackendSession) { + const { magicWord, memberCnt } = msg; + if (magicWord !== DEBUG_MAGIC_WORD) { + return resResult(STATUS.TOKEN_ERR); + } + + const serverId = session.get('serverId'); + + let statusResult = getGuildActivityStatus(this.aid); + if (!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); + + let obj = getRaceActivityObj(); + let guildCode = genCode(8); + + for(let i = 0; i < memberCnt; i++) { + await obj.joinWoodenHorse(guildCode, `roleId${i}`, 'roleName', serverId, null, 6, 'code', true); + } + + return resResult(STATUS.SUCCESS); + } } \ No newline at end of file diff --git a/game-server/app/services/guildActivity/guildActivityService.ts b/game-server/app/services/guildActivity/guildActivityService.ts index f87df0ccf..703bd52a2 100644 --- a/game-server/app/services/guildActivity/guildActivityService.ts +++ b/game-server/app/services/guildActivity/guildActivityService.ts @@ -5,7 +5,7 @@ import { gameData, getGuildAuctionRewards, getCityActivityRewards } from "../../ 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 { GateMembersRec, CityParam, Member, WoodenHorse, RaceActivityRankParam } from "../../domain/battleField/guildActivity"; import { DicGuildActivity } from "../../pubUtils/dictionary/DicGuildActivity"; import { getAllServers, getRoleOnlineInfo } from "../redisService"; import { SimpleGuildRankParam, SimpleRoleRankParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank"; @@ -622,42 +622,7 @@ export async function sendGuildCityDeclare(cityId: number, declareGuildCode: str export async function calWoodenHorseAndSend(serverId: number) { console.log('calWoodenHorseAndSend'); let obj = getRaceActivityObj(); - let { guildRank: ranks } = await obj.getRanks(serverId); - - let map = new Map(); - // 找到往前和往后2艘船 - for (let i = 0; i < ranks.length; i++) { - let { code } = ranks[i]; - for (let j = i; j <= i + 2; j++) { - if (j <= ranks.length - 1 && !map.has(j)) { - map.set(j, new Array()); - } - } - for (let [rank, woodenHorseList] of map) { - let limit = 5; - if (rank - 2 < 0) limit += rank - 2; - if (rank + 2 > ranks.length - 1) limit -= (rank + 2) - (ranks.length - 1); - - let woodenHorse = await obj.getWoodenHorse(code, serverId); - if (!!woodenHorse) { - map.get(rank).push(woodenHorse); - } else { - limit--; // 理论上不能出现没有woodenHorse的情况,但是如果出现了,以防无返回 - } - let len = map.get(rank).length; - if (len >= limit) { - // 发送 - // console.log('send', woodenHorseList.length); - let curRank = ranks[rank]; - let wh = await obj.getWoodenHorse(curRank.code, serverId); - let events = obj.getEvents(curRank.code, wh ? wh.distance : 0); - await sendMessageToGuildWithSuc(curRank.code, PUSH_ROUTE.GUILD_RACE_UPDATE, { timestamp: Date.now(), woodenHorseList: woodenHorseList.filter(cur => cur.status != RACE_ACTIVITY_STATUS.END), guildRank: ranks, myGuildRank: curRank, events }); - - map.delete(rank); - } - } - } - return; + return await obj.calServerHorses(serverId); } /** @@ -687,7 +652,8 @@ export async function gateActivityStart() { * @param serverId 服务器id */ export async function raceActivitySettleReward(guildCode: string, woodenHorse: WoodenHorse) { - let { serverId, durability, distance } = woodenHorse; + let { serverId, durability, distance, isRobot } = woodenHorse; + if(isRobot) return; let obj = getRaceActivityObj(); // 计算排名,计算耐久,发送奖励 let { guildRank, myGuildRank } = await obj.getRanks(serverId, guildCode); diff --git a/game-server/app/services/guildActivity/raceActivityObj.ts b/game-server/app/services/guildActivity/raceActivityObj.ts index 2b8e0c0d1..d979d3121 100644 --- a/game-server/app/services/guildActivity/raceActivityObj.ts +++ b/game-server/app/services/guildActivity/raceActivityObj.ts @@ -6,7 +6,7 @@ import { RewardInter } from "../../pubUtils/interface"; import { getRaceEventItems, gameData } from "../../pubUtils/data"; import { GuildModel } from "../../db/Guild"; import { sendSingleRaceActEndMsg } from "./guildActivityService"; -import { REDIS_KEY, RACE_EVENT_TYPE, RACE_EVENT_EFFECT_TYPE, RACE_EVENT, STATUS, RACE_ACTIVITY_STATUS, PUSH_ROUTE, GUILD_ACTIVITY_STATUS } from "../../consts"; +import { REDIS_KEY, RACE_EVENT_TYPE, RACE_EVENT_EFFECT_TYPE, RACE_EVENT, STATUS, RACE_ACTIVITY_STATUS, PUSH_ROUTE, GUILD_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../consts"; import { getRandEelm, sortArrRandom, resResult, getRandResultByMember } from "../../pubUtils/util"; import { sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToUserWithSuc } from "../pushService"; @@ -50,6 +50,7 @@ export class RaceActivityObject { public async getRanks(serverId: number, guildCode?: string) { let myRank: RaceActivityRankParam = null; let ranks: RaceActivityRankParam[] = []; + let myIndex = -1; for(let [_, _wh] of this.woodenHorses) { if(_wh.serverId == serverId && _wh.status != GUILD_ACTIVITY_STATUS.WAITING) { let wh = await this.getWoodenHorse(_wh.guildCode, _wh.serverId); @@ -68,6 +69,7 @@ export class RaceActivityObject { wh.setRank(index + 1); if(guildCode && wh.code == guildCode) { myRank = wh; + myIndex = index; } return wh }); @@ -77,11 +79,11 @@ export class RaceActivityObject { if(myWoodenHorse) myRank = new RaceActivityRankParam(myWoodenHorse); } - return { guildRank: ranks, myGuildRank: myRank } + return { guildRank: ranks, myGuildRank: myRank, myIndex } } - public async joinWoodenHorse(guildCode: string, roleId: string, roleName: string, serverId: number, sid: string, job: number, code: string) { - let woodenHorse = await this.getWoodenHorse(guildCode, serverId); + public async joinWoodenHorse(guildCode: string, roleId: string, roleName: string, serverId: number, sid: string, job: number, code: string, isDebug = false) { + let woodenHorse = await this.getWoodenHorse(guildCode, serverId, isDebug); if(!woodenHorse) return false; let member = woodenHorse.joinMember(roleId, roleName, sid, code) this.pushMember(guildCode, roleId, job, code); @@ -94,14 +96,19 @@ export class RaceActivityObject { } // 获取某个军团的木马状态 - public async getWoodenHorse(guildCode: string, serverId: number) { + public async getWoodenHorse(guildCode: string, serverId: number, isDebug: boolean = false) { if(!this.woodenHorses.has(guildCode)) { this.initEvents(guildCode); - let guild = await GuildModel.findByCode(guildCode, serverId); - if(!guild) return false; - let { name: guildName, guildCe } = guild; - this.woodenHorses.set(guildCode, new WoodenHorse(guildCode, guildName, guildCe, serverId, this.allStartTime)); - this.guildList.push({guildCode, serverId}); + if(isDebug) { + this.woodenHorses.set(guildCode, new WoodenHorse(guildCode, guildCode, 0, serverId, this.allStartTime, false)); + this.guildList.push({guildCode, serverId}); + } else { + let guild = await GuildModel.findByCode(guildCode, serverId); + if(!guild) return undefined; + let { name: guildName, guildCe } = guild; + this.woodenHorses.set(guildCode, new WoodenHorse(guildCode, guildName, guildCe, serverId, this.allStartTime, false)); + this.guildList.push({guildCode, serverId}); + } } let woodenHorse = this.woodenHorses.get(guildCode); let events = this.events.get(guildCode)||[]; @@ -125,13 +132,13 @@ export class RaceActivityObject { events.push(event); this.events.set(toGuild, events); } - let { guildRank, myGuildRank } = await this.getRanks(serverId, toGuild); + let { guildRank, myGuildRank, myIndex } = await this.getRanks(serverId, toGuild); + console.log('####', myIndex) if(myGuildRank) { - for(let { code, rank } of guildRank) { - if(rank >= myGuildRank.rank - 2 && rank <= myGuildRank.rank + 2 ) { - await sendMessageToGuildWithSuc(code, PUSH_ROUTE.GUILD_RACE_EVENT, { timestamp: Date.now(), events: [event] }); - } - } + let woodenHorseList = await this.getScreenHorses(serverId, guildRank, myIndex, true, Date.now() - event.startTime); + for(let woodenHorse of woodenHorseList||[]) { + if(woodenHorse) await sendMessageToGuildWithSuc(woodenHorse.guildCode, PUSH_ROUTE.GUILD_RACE_EVENT, { timestamp: Date.now(), events: [event] }); + } } else { await sendMessageToGuildWithSuc(toGuild, PUSH_ROUTE.GUILD_RACE_EVENT, { timestamp: Date.now(), events: [event] }); } @@ -262,5 +269,54 @@ export class RaceActivityObject { public hasSend(guildCode: string) { return this.hasSentGuild.indexOf(guildCode) != -1; } + + public async calServerHorses(serverId: number) { + let { guildRank: ranks } = await this.getRanks(serverId); + // 找到往前和往后2艘船 + for (let i = 0; i < ranks.length; i++) { + await this.getScreenHorses(serverId, ranks, i, true); + } + + } + + private async getScreenHorses(serverId: number, ranks: RaceActivityRankParam[], i: number, needSend: boolean, time = 0) { + let curRank = ranks[i]; + if(curRank.durability == 0) return; + + let beforeHorses: WoodenHorse[] = [], afterHorses: WoodenHorse[] = [], beforeCnt = 0, afterCnt = 0; + for(let j = i - 1; j >= 0; j--) { + if(ranks[j]) { + let wh = await this.getWoodenHorse(ranks[j].code, serverId); + if(wh) { + beforeHorses.push(wh); + if(ranks[j].durability > 0) beforeCnt ++ + } + } + if(beforeCnt >= 2) break; + } + for(let j = i + 1; j < ranks.length; j++) { + if(ranks[j]) { + let wh = await this.getWoodenHorse(ranks[j].code, serverId); + if(wh) { + afterHorses.push(wh); + if(ranks[j].durability > 0) afterCnt++; + } + } + if(afterCnt >= 2) break; + } + // 发送 + // console.log('send', woodenHorseList.length); + let wh = await this.getWoodenHorse(curRank.code, serverId); + let woodenHorseList = wh? [...beforeHorses.reverse(), wh, ...afterHorses]: [...beforeHorses.reverse(), ...afterHorses]; + + if(needSend) { + let timeout = setTimeout(async () => { + let events = this.getEvents(curRank.code, wh ? wh.distance : 0); + await sendMessageToGuildWithSuc(curRank.code, PUSH_ROUTE.GUILD_RACE_UPDATE, { timestamp: Date.now(), woodenHorseList, guildRank: ranks, myGuildRank: curRank, events }); + clearTimeout(timeout); + }, time); + } + return woodenHorseList + } } diff --git a/shared/consts/constModules/guildConst.ts b/shared/consts/constModules/guildConst.ts index fca479c24..4f0ad892a 100644 --- a/shared/consts/constModules/guildConst.ts +++ b/shared/consts/constModules/guildConst.ts @@ -310,7 +310,7 @@ export enum RACE_ACTIVITY_STATUS { WAITING = 0, // 未开始 START = 1, // 已开始 END = 2, // 已结束 - PAUSE = 3, // 暂停 + BREAK = 3, // 爆破 } export const CITY_ACTIVITY_DOOR = 1047; \ No newline at end of file diff --git a/shared/domain/battleField/guildActivity.ts b/shared/domain/battleField/guildActivity.ts index dd0c5dd25..dec269ea5 100644 --- a/shared/domain/battleField/guildActivity.ts +++ b/shared/domain/battleField/guildActivity.ts @@ -89,17 +89,17 @@ export class WoodenHorse { shield: number = 0; // 护盾数量 @prop({required: true}) shieldTime: number = 0; // 天师盾符 - @prop({required: true}) - stopContinueTime: number = 0; // 鬼手阴符 remainItems: Map = new Map(); + isRobot: boolean = false; // debug接口生成 - constructor(guildCode: string, guildName: string, guildCe: number, serverId: number, allStartTime: number) { + constructor(guildCode: string, guildName: string, guildCe: number, serverId: number, allStartTime: number, isRobot: boolean) { this.guildCode = guildCode; this.guildName = guildName; this.guildCe = guildCe; this.serverId = serverId; this.allStartTime = allStartTime; + this.isRobot = isRobot; } public startRace(allStartTime: number) { @@ -116,9 +116,6 @@ export class WoodenHorse { */ public calCurWoodenHorse(events: Event[]): boolean { if(this.status == RACE_ACTIVITY_STATUS.END) return false; - if(this.status == RACE_ACTIVITY_STATUS.PAUSE && this.stopContinueTime && Date.now() > this.stopContinueTime) { - this.status = RACE_ACTIVITY_STATUS.START; this.stopContinueTime = 0; - } if(this.status == RACE_ACTIVITY_STATUS.START) { if(this.distance >= GUILDACTIVITY.RACEACTIVITY_LENGTH) { @@ -165,7 +162,7 @@ export class WoodenHorse { this.calEvent(id, count, endTime); } if(this.durability <= 0) { - this.status = RACE_ACTIVITY_STATUS.END; + this.status = RACE_ACTIVITY_STATUS.BREAK; this.speed = 0; } return false; @@ -189,10 +186,8 @@ export class WoodenHorse { break; case RACE_EVENT.GUISHOUYINFU: if (this.shieldTime < Date.now()) { - this.stopContinueTime = endTime; - this.status = RACE_ACTIVITY_STATUS.PAUSE; this.time = endTime; - this.speed = 0; + this.speed = effect[1]; } break; case RACE_EVENT.FENGCHE: @@ -263,10 +258,8 @@ export class WoodenHorse { } public getTreatTime() { - console.log('#######', this.time, this.allStartTime) return {...this, time: this.time - this.allStartTime } } - } export class Event { @@ -309,6 +302,16 @@ export class Event { setStartTime(time: number) { this.startTime = time; } + + needReCalHorse() { + let importantEvents = [ + RACE_EVENT.LIANNU, // 连弩,可能durability突然变0 + RACE_EVENT.GUISHOUYINFU, // 鬼手阴符 + RACE_EVENT.FENGCHE, // 风车 + RACE_EVENT.WUGUIBANYUNFU, // 五鬼搬运符 + ]; + return importantEvents.indexOf(this.id) != -1 + } } export interface GuildRankParams { diff --git a/shared/resource/jsons/dic_zyz_raceActivity.json b/shared/resource/jsons/dic_zyz_raceActivity.json index e80fca8dd..821bf50fb 100644 --- a/shared/resource/jsons/dic_zyz_raceActivity.json +++ b/shared/resource/jsons/dic_zyz_raceActivity.json @@ -5,10 +5,10 @@ "info": "每个造成0.2%的耐久度伤害", "type": 0, "effectType": 0, - "effect": "0.2&", + "effect": "100&", "continueTime": 0, "continueDistance": 0, - "effecttime": 5, + "effecttime": 1, "effectinfo": "遭受诸葛连弩袭击", "object": 2, "useCount": "5&10" @@ -19,10 +19,10 @@ "info": "使用后敌方停止移动,持续5秒", "type": 0, "effectType": 0, - "effect": "5&", + "effect": "5&0.1", "continueTime": 5, "continueDistance": 0, - "effecttime": 5, + "effecttime": 1, "effectinfo": "遭遇鬼手戏弄,木牛流马无法移动。", "object": 2, "useCount": "1&" @@ -36,7 +36,7 @@ "effect": "2&5", "continueTime": 5, "continueDistance": 0, - "effecttime": 5, + "effecttime": 1, "effectinfo": "大风车吱呀直溜溜地转", "object": 1, "useCount": "5&10" @@ -50,7 +50,7 @@ "effect": "30&5", "continueTime": 5, "continueDistance": 0, - "effecttime": 5, + "effecttime": 1, "effectinfo": "五鬼搬运,千里无踪。万钧之物,不过只手。", "object": 1, "useCount": "1&" @@ -64,7 +64,7 @@ "effect": "20&", "continueTime": 0, "continueDistance": 0, - "effecttime": 5, + "effecttime": 1, "effectinfo": "大盾防护", "object": 1, "useCount": "1&"