军团活动:修改粮草先行

This commit is contained in:
luying
2022-04-30 19:19:48 +08:00
parent d9d0aad862
commit 2b737f2528
6 changed files with 160 additions and 123 deletions
@@ -8,8 +8,7 @@ import { Record, UserGuildActivityRecModel } from "../../db/UserGuildActivityRec
import { GateMembersRec, CityParam, Member, WoodenHorse } from "../../domain/battleField/guildActivity";
import { DicGuildActivity } from "../../pubUtils/dictionary/DicGuildActivity";
import { getAllServers, getRoleOnlineInfo } from "../redisService";
import { SimpleGuildRankParam, SimpleRoleRankParam, SimpleGuildRankWithTimeParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank";
import { getGuildChannelSid, getWorldChannelSid, getCityChannelSid } from "../chatChannelService";
import { SimpleGuildRankParam, SimpleRoleRankParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank";
import { pinus } from "pinus";
import { GuildActivityRecordModel } from "../../db/GuildActivityRec";
import { genAuction } from "../auctionService";
@@ -22,7 +21,6 @@ import { RaceActivityObject } from "./raceActivityObj";
import { Rank } from "../rankService";
import { BossInstanceModel } from "../../db/BossInstance";
import { UserGuildModel } from "../../db/UserGuild";
import { raceActivityEnd } from "../timeTaskService";
import { addActive } from "../guildService";
import { ActivePlayer, GuildRecord, ServerRecordModel } from "../../db/ServerRecords";
import { Attack } from "../../domain/battleField/pvp";
@@ -222,25 +220,6 @@ export async function getCityActivityRank(guildCode: string, serverId: number, c
return { guildRank, myGuildRank, memberRank, myMemberRank }
}
export async function getRaceActivityRank(guildCode: string, serverId: number) {
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId }, true);
r.setGenerFieldsFun(generField);
let { myRank, ranks } = await r.getRankListWithMyRank({ guildCode });
if (!myRank) {
myRank = await r.generMyRankWithGuild(guildCode, 0, 0);
}
return { guildRank: ranks, myGuildRank: myRank }
}
function generField(params: GuildRankInfo) {
let { rank, code, name, num, time } = params;
let param = new SimpleGuildRankWithTimeParam(rank, code, name, { distance: num / 1000, time: Math.floor(time), startTime: 0, durability: 0 });
return param;
}
/**
* 获取和自己同屏的5个木牛流马
* @param guildCode
@@ -248,17 +227,18 @@ function generField(params: GuildRankInfo) {
*/
export async function getWoodenHorseList(guildCode: string, serverId: number) {
let obj = getRaceActivityObj();
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId }, true, 5);
let { myGuildRank, guildRank } = await obj.getRanks(serverId, guildCode);
let myRank = await r.getMyRank({ guildCode });
let myRank = myGuildRank?.rank||0;
let startRank = myRank - 2 > 0 ? myRank - 2 : 1;
let endRank = startRank + 4;
let range = <GuildRankInfo[]>await r.getRankByRange(startRank, endRank);
let woodenHorseList = new Array<WoodenHorse>();
for (let { code } of range) {
let woodenHorse = await obj.getWoodenHorse(code, serverId);
if (woodenHorse) {
woodenHorseList.push(woodenHorse);
for (let { rank, code } of guildRank) {
if(rank >= startRank && rank <= endRank) {
let woodenHorse = await obj.getWoodenHorse(code, serverId);
if (woodenHorse) {
woodenHorseList.push(woodenHorse);
}
}
}
return woodenHorseList;
@@ -618,33 +598,10 @@ export async function sendGuildCityDeclare(cityId: number, declareGuildCode: str
*/
export async function calWoodenHorseAndSend(serverId: number) {
console.log('calWoodenHorseAndSend');
let guildKey = REDIS_KEY.RACE_ACTIVITY;
let obj = getRaceActivityObj();
let calResult = new Map<string, WoodenHorse>();
for(let [code] of obj.getAllWoodenHorses()) {
let _obj = await obj.getWoodenHorse(code, serverId);
if(_obj) calResult.set(code, _obj);
}
let { guildRank: ranks } = await obj.getRanks(serverId);
let fun = async function (param: GuildRankInfo) {
let { rank, code, name } = param;
let _obj = calResult.get(code);
return new SimpleGuildRankWithTimeParam(rank, code, name, _obj);
}
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId }, true);
r.setGenerFieldsFun(fun);
let ranks = <GuildRankInfo[]>await r.getRankByRange();
let map = new Map<number, WoodenHorse[]>();
let guildRank = new Array<SimpleGuildRankWithTimeParam>();
let l = ranks.length > 10 ? 10 : ranks.length;
for (let i = 0; i < l; i++) {
let { rank, code, name, num } = ranks[i]
let _obj = await obj.getWoodenHorse(code, serverId);
let param = new SimpleGuildRankWithTimeParam(rank, code, name, _obj);
guildRank.push(param);
}
// 找到往前和往后2艘船
for (let i = 0; i < ranks.length; i++) {
let { code } = ranks[i];
@@ -670,15 +627,13 @@ export async function calWoodenHorseAndSend(serverId: number) {
// console.log('send', woodenHorseList.length);
let curRank = ranks[rank];
let wh = await obj.getWoodenHorse(curRank.code, serverId);
let myGuildRank = new SimpleGuildRankWithTimeParam(curRank.rank, curRank.code, curRank.name, wh);
let events = obj.getEvents(curRank.code, wh ? wh.distance : 0);
await sendMessageToGuildWithSuc(curRank.code, PUSH_ROUTE.GUILD_RACE_UPDATE, { timestamp: Date.now(), woodenHorseList, guildRank, myGuildRank, events });
await sendMessageToGuildWithSuc(curRank.code, PUSH_ROUTE.GUILD_RACE_UPDATE, { timestamp: Date.now(), woodenHorseList, guildRank: ranks, myGuildRank: curRank, events });
map.delete(rank);
}
}
}
calResult.clear();
return;
}
@@ -703,17 +658,21 @@ export async function raceActivitySettleReward(guildCode: string, woodenHorse: W
let { serverId, durability, distance } = woodenHorse;
let obj = getRaceActivityObj();
// 计算排名,计算耐久,发送奖励
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId }, true);
let { guildRank, myGuildRank } = await obj.getRanks(serverId, guildCode);
let rank = myGuildRank?.rank||0;
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId });
await r.setRankWithGuildInfo2(guildCode, myGuildRank.num, myGuildRank.sortTime, myGuildRank.durability);
let isSuccess = distance >= GUILDACTIVITY.RACEACTIVITY_LENGTH; // 血条未击破则没有占领军团
let myGuildRank = await r.getMyRank({ guildCode });
let members = obj.getMembersOfGuild(guildCode);
let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, myGuildRank);
let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, rank);
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, {
memberCnt: members.length, members,
isSuccess, isCompleted: true, rank: myGuildRank,
isSuccess, isCompleted: true, rank,
rewards: rewards.map(cur => cur.goods),
woodenHorse,
woodenHorse: woodenHorse.getTreatTime(),
});
if (rec) {
// 奖励加入拍卖行
@@ -723,9 +682,7 @@ export async function raceActivitySettleReward(guildCode: string, woodenHorse: W
let honour = dic.honour + Math.floor(durability * GUILDACTIVITY.RACEACTIVITY_DURABILITY_REWARD);
for(let { roleId } of members) {
await updateUserRecAndSendHonour(honour, 0, myGuildRank, roleId, members);
let onlineUser = await getRoleOnlineInfo(roleId);
await updateUserRecAndSendHonour(honour, 0, rank, roleId, members);
// 发放活跃
await addActive(roleId, serverId, GUILD_POINT_WAYS.ACTIVITY); //获得活跃值
}
@@ -1,22 +1,19 @@
// 军团活动蛮夷入侵城门血量等数据存储
import { Member, GateMembersRec, WoodenHorse, Event, WoodenHorseMember } from "../../domain/battleField/guildActivity";
import { Member, GateMembersRec, WoodenHorse, Event, WoodenHorseMember, RaceActivityRankParam } from "../../domain/battleField/guildActivity";
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 } from "../../consts";
import { getGuildChannelSid } from "../chatService";
import { pinus } from "pinus";
import { REDIS_KEY, RACE_EVENT_TYPE, RACE_EVENT_EFFECT_TYPE, RACE_EVENT, STATUS, RACE_ACTIVITY_STATUS, PUSH_ROUTE, GUILD_ACTIVITY_STATUS } from "../../consts";
import { getRandEelm, sortArrRandom, resResult, getRandResultByMember } from "../../pubUtils/util";
import { Rank } from "../rankService";
import { getTimeFun } from "../../pubUtils/timeUtil";
import { sendMessageToGuildWithSuc, sendMessageToUserWithSuc } from "../pushService";
// 粮草先行
export class RaceActivityObject {
private status = RACE_ACTIVITY_STATUS.WAITING; // 活动状态 0-未开始 1-已开始 2-已结束
public status = RACE_ACTIVITY_STATUS.WAITING; // 活动状态 0-未开始 1-已开始 2-已结束
private allStartTime = 0; // 开启时间,每天晚上8点
public guildList: Array<{ serverId: number, guildCode: string }> = []; // 所有军团
private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
private woodenHorses: Map<string, WoodenHorse> = new Map(); // 每个军团的木牛流马 guildCode => WoodenHorse
@@ -50,6 +47,39 @@ export class RaceActivityObject {
return this.woodenHorses;
}
public async getRanks(serverId: number, guildCode?: string) {
let myRank: RaceActivityRankParam = null;
let ranks: RaceActivityRankParam[] = [];
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);
if(wh) {
ranks.push(new RaceActivityRankParam(wh));
}
}
}
ranks.sort((a, b) => {
if(a.sortDistance == b.sortDistance) {
return a.sortTime - b.sortTime;
} else {
return b.sortDistance - a.sortDistance;
}
}).map((wh, index) => {
wh.setRank(index + 1);
if(guildCode && wh.code == guildCode) {
myRank = wh;
}
return wh
});
if(!myRank && guildCode) {
let myWoodenHorse = await this.getWoodenHorse(guildCode, serverId);
if(myWoodenHorse) myRank = new RaceActivityRankParam(myWoodenHorse);
}
return { guildRank: ranks, myGuildRank: myRank }
}
public async joinWoodenHorse(guildCode: string, roleId: string, roleName: string, serverId: number, sid: string, job: number, code: string) {
let woodenHorse = await this.getWoodenHorse(guildCode, serverId);
if(!woodenHorse) return false;
@@ -70,23 +100,16 @@ export class RaceActivityObject {
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.woodenHorses.set(guildCode, new WoodenHorse(guildCode, guildName, guildCe, serverId, this.allStartTime));
this.guildList.push({guildCode, serverId});
}
let woodenHorse = this.woodenHorses.get(guildCode);
let events = this.events.get(guildCode)||[];
let needSendEnd = woodenHorse.calCurWoodenHorse(events);
if(woodenHorse.status == RACE_ACTIVITY_STATUS.START || woodenHorse.status == RACE_ACTIVITY_STATUS.END) { // 更新距离
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId }, true, 5);
await r.setRank({guildCode}, [Math.floor(woodenHorse.distance * 1000), woodenHorse.time], false);
let tomorrow = <number>getTimeFun().getAfterDayWithHour();
await r.setExpire(tomorrow);
if (needSendEnd) { // 抵达后发送奖励,发送消息,结算
await sendSingleRaceActEndMsg(guildCode, woodenHorse);
}
if (needSendEnd) { // 抵达后发送奖励,发送消息,结算
await sendSingleRaceActEndMsg(guildCode, woodenHorse);
}
this.handleItemsByWoodenHorse(woodenHorse);
return woodenHorse;
}
@@ -109,6 +132,7 @@ export class RaceActivityObject {
// 定时任务到,开始比赛,设置开始赛道,发放初始道具
public startRace() {
this.status = RACE_ACTIVITY_STATUS.START;
if(this.allStartTime == 0) this.allStartTime = Date.now();
let guildCodes = new Array<string>();
for(let [code, woodenHorse] of this.woodenHorses) {
if(woodenHorse.memberCnt > 0) {
@@ -120,9 +144,7 @@ export class RaceActivityObject {
}
private woodenHorseStartRace(woodenHorse: WoodenHorse) {
woodenHorse.status = RACE_ACTIVITY_STATUS.START;
woodenHorse.time = Date.now();
woodenHorse.startTime = Date.now();
woodenHorse.startRace(this.allStartTime);
let members = woodenHorse.members;
let normalItems = getRaceEventItems();
this.sendRandItemsToMembers(members, woodenHorse, normalItems);