排行榜:首通逻辑修改
This commit is contained in:
@@ -1,14 +1,12 @@
|
|||||||
import { KeyName, KeyNameParam, RankParam, GuildRankParam, RoleRankInfo, GuildLeader, LineupParam, myIdInter, GeneralRankParam, ValueConfig, GuildRankInfo, RoleAndGuildRankInfo } from "../domain/rank";
|
import { KeyName, KeyNameParam, RankParam, GuildRankParam, RoleRankInfo, LineupParam, myIdInter, GeneralRankParam, ValueConfig, GuildRankInfo, RoleAndGuildRankInfo } from "../domain/rank";
|
||||||
import { getInfoKeyByRedisKey, ROLE_SELECT, GUILD_SELECT, REDIS_KEY, HERO_SELECT, COMPOSE_FIELD_TYPE, KEY_TO_COMPOSE_FIELD, getRedisKeyByRankType, COUNTER, RANK_TYPE, PUSH_ROUTE } from "../consts";
|
import { getInfoKeyByRedisKey, ROLE_SELECT, GUILD_SELECT, REDIS_KEY, HERO_SELECT, COMPOSE_FIELD_TYPE, KEY_TO_COMPOSE_FIELD, getRedisKeyByRankType, COUNTER, RANK_TYPE, PUSH_ROUTE } from "../consts";
|
||||||
import { redisClient, delKeys } from "./redisService";
|
import { redisClient, delKeys } from "./redisService";
|
||||||
import { RoleType, RoleModel } from "../db/Role";
|
import { RoleType, RoleModel } from "../db/Role";
|
||||||
import { GuildType, GuildModel } from "../db/Guild";
|
import { GuildType, GuildModel } from "../db/Guild";
|
||||||
import { HeroModel, HeroType, HeroUpdate } from "../db/Hero";
|
import { HeroModel, HeroType, HeroUpdate } from "../db/Hero";
|
||||||
import { PVPConfigModel } from "../db/SystemConfig";
|
|
||||||
import { PvpDefenseModel } from "../db/PvpDefense";
|
import { PvpDefenseModel } from "../db/PvpDefense";
|
||||||
import { gameData } from "../pubUtils/data";
|
import { gameData } from "../pubUtils/data";
|
||||||
import { getSeconds, nowSeconds } from "../pubUtils/timeUtil";
|
import { getSeconds, nowSeconds } from "../pubUtils/timeUtil";
|
||||||
import { getWorldChannelSid } from "./chatChannelService";
|
|
||||||
import { BackendSession, pinus } from "pinus";
|
import { BackendSession, pinus } from "pinus";
|
||||||
import { RankFirstModel, RankFirstType, RankFirstUpdateParam } from "../db/RankFirst";
|
import { RankFirstModel, RankFirstType, RankFirstUpdateParam } from "../db/RankFirst";
|
||||||
import { getRandSingleEelm } from "../pubUtils/util";
|
import { getRandSingleEelm } from "../pubUtils/util";
|
||||||
@@ -355,7 +353,7 @@ export class Rank {
|
|||||||
} else {
|
} else {
|
||||||
newScore = await this.updateRankScoreEncode(myId, scores, isInc)
|
newScore = await this.updateRankScoreEncode(myId, scores, isInc)
|
||||||
}
|
}
|
||||||
this.checkMyRankAndPush(myId, oldScore, newScore);
|
this.checkFirstRankAndPush(myId, oldScore, newScore);
|
||||||
return newScore;
|
return newScore;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -904,51 +902,77 @@ export class Rank {
|
|||||||
return timestamp
|
return timestamp
|
||||||
}
|
}
|
||||||
|
|
||||||
private async checkMyRankAndPush(myId: myIdInter, oldScore: number, newScore: number) {
|
private async getFirstUserInfo(myId: myIdInter) {
|
||||||
|
const info = await redisClient().hgetAsync(this.infoKey, this.composeFields(this.infoKey, myId));
|
||||||
|
const playerInfo = JSON.parse(info);
|
||||||
|
|
||||||
|
if (this.infoKey == REDIS_KEY.USER_INFO) {
|
||||||
|
let userInfo = new RankParam(playerInfo);
|
||||||
|
return { userInfo }
|
||||||
|
} else if (this.infoKey == REDIS_KEY.GUILD_INFO) {
|
||||||
|
let guildInfo = new GuildRankInfo(playerInfo);
|
||||||
|
return { guildInfo }
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 首通
|
||||||
|
private async checkFirstRankAndPush(myId: myIdInter, oldScore: number, newScore: number) {
|
||||||
let ts = this;
|
let ts = this;
|
||||||
if (ts.isInit) return;
|
if (ts.isInit) return;
|
||||||
let myRank = await this.getMyRank(myId);
|
|
||||||
// console.log('*******', ts.key, myRank, newScore, oldScore);
|
|
||||||
if (myRank == 1 && newScore > oldScore) {
|
|
||||||
let serverId = this.keyName.serverId;
|
|
||||||
let sid = await getWorldChannelSid(serverId);
|
|
||||||
let dicRank = gameData.rank.find(({ id }) => {
|
|
||||||
let redisKey = getRedisKeyByRankType(id);
|
|
||||||
return redisKey == ts.key
|
|
||||||
});
|
|
||||||
// console.log('*******', dicRank);
|
|
||||||
if(dicRank) {
|
|
||||||
let r = new Rank(ts.key, { serverId }, false, 1);
|
|
||||||
let ranks = await r.getRankByRange();
|
|
||||||
let rankFirstRecs: (RankFirstType & { status: number })[] = [];
|
|
||||||
if(ranks.length > 0 && ranks[0]) {
|
|
||||||
let userInfo: RankParam, guildInfo: GuildRankParam;
|
|
||||||
if(ranks[0] instanceof RoleRankInfo) {
|
|
||||||
userInfo = ranks[0];
|
|
||||||
}
|
|
||||||
if(ranks[0] instanceof GuildRankInfo) {
|
|
||||||
guildInfo = ranks[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
for(let [id, { rankId, condition }] of gameData.generalRankReward) {
|
let serverId = this.keyName.serverId;
|
||||||
// console.log(rankId, dicRank.id, oldScore, condition, newScore);
|
let dicRank = gameData.rank.find(({ id }) => {
|
||||||
if(dicRank.id == rankId && oldScore < condition && newScore >= condition) {
|
let redisKey = getRedisKeyByRankType(id);
|
||||||
let rankFirstRec = await RankFirstModel.createRankFirst(serverId, id, rankId, { userInfo, guildInfo });
|
return redisKey == ts.key
|
||||||
if(rankFirstRec && getSeconds(rankFirstRec.createdAt) == getSeconds(rankFirstRec.updatedAt)) {
|
});
|
||||||
let roleServers = pinus.app.getServersByType('role');
|
if(!dicRank) return;
|
||||||
for(let server of roleServers) {
|
|
||||||
pinus.app.rpc.role.roleRemote.setRankFirst.toServer(server.id, rankFirstRec);
|
let infos = await this.getFirstUserInfo(myId);
|
||||||
}
|
if(!infos) return;
|
||||||
rankFirstRecs.push({ ... rankFirstRec, status: 1});
|
|
||||||
}
|
let { userInfo, guildInfo } = infos
|
||||||
}
|
let rankFirstRecs: (RankFirstType & { status: number })[] = [];
|
||||||
}
|
for(let [id, { rankId, condition }] of gameData.generalRankReward) {
|
||||||
}
|
// console.log(rankId, dicRank.id, oldScore, condition, newScore);
|
||||||
if(rankFirstRecs.length > 0) {
|
let hasRankFirst = await getRankFirstRewardById(serverId, id);
|
||||||
await sendMessageToServerWithSuc(serverId, PUSH_ROUTE.RANK_TOP_UPDATE, { ranks: rankFirstRecs }, true);
|
if(!hasRankFirst && dicRank.id == rankId && oldScore < condition && newScore >= condition) {
|
||||||
|
let rankFirstRec = await RankFirstModel.createRankFirst(serverId, id, rankId, { userInfo, guildInfo });
|
||||||
|
if(rankFirstRec && getSeconds(rankFirstRec.createdAt) == getSeconds(rankFirstRec.updatedAt)) {
|
||||||
|
await setRankFirst(rankFirstRec);
|
||||||
|
rankFirstRecs.push({ ... rankFirstRec, status: 1});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(rankFirstRecs.length > 0) {
|
||||||
|
await sendMessageToServerWithSuc(serverId, PUSH_ROUTE.RANK_TOP_UPDATE, { ranks: rankFirstRecs }, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从其他服获取首通信息
|
||||||
|
* @param serverId
|
||||||
|
* @param id dic_zyz_rankingType的id
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
async function getRankFirstRewardById(serverId: number, id: number) {
|
||||||
|
let rankFirst: RankFirstType;
|
||||||
|
if(pinus.app.getServerType() == 'role') {
|
||||||
|
rankFirst = pinus.app.get('rankFirstRewards').get(serverId)?.get(id);
|
||||||
|
} else {
|
||||||
|
let roleServers = pinus.app.getServersByType('role');
|
||||||
|
let server = getRandSingleEelm(roleServers);
|
||||||
|
rankFirst = await pinus.app.rpc.role.roleRemote.getRankFirstById.toServer(server.id, serverId, id);
|
||||||
|
}
|
||||||
|
return rankFirst;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setRankFirst(rankFirstRec: RankFirstType) {
|
||||||
|
let roleServers = pinus.app.getServersByType('role');
|
||||||
|
for(let server of roleServers) {
|
||||||
|
pinus.app.rpc.role.roleRemote.setRankFirst.toServer(server.id, rankFirstRec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1120,14 +1144,7 @@ export async function getGeneralRank(role: RoleType & { rankReceived: number[] }
|
|||||||
let result: (RankFirstUpdateParam & {status: number})[] = [];
|
let result: (RankFirstUpdateParam & {status: number})[] = [];
|
||||||
|
|
||||||
for (let [id, { rankId: type } ] of gameData.generalRankReward) {
|
for (let [id, { rankId: type } ] of gameData.generalRankReward) {
|
||||||
let rankFirst: RankFirstType;
|
let rankFirst = await getRankFirstRewardById(serverId, id);
|
||||||
if(pinus.app.getServerType() == 'role') {
|
|
||||||
rankFirst = pinus.app.get('rankFirstRewards').get(serverId)?.get(id);
|
|
||||||
} else {
|
|
||||||
let roleServers = pinus.app.getServersByType('role');
|
|
||||||
let server = getRandSingleEelm(roleServers);
|
|
||||||
rankFirst = await pinus.app.rpc.role.roleRemote.getRankFirstById.toServer(server.id, serverId, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(rankFirst) {
|
if(rankFirst) {
|
||||||
let status = rankReceived.includes(id)?RANK_FIRST_REWARD_STATUS.RECEIVED: RANK_FIRST_REWARD_STATUS.CAN_RECEIVE;
|
let status = rankReceived.includes(id)?RANK_FIRST_REWARD_STATUS.RECEIVED: RANK_FIRST_REWARD_STATUS.CAN_RECEIVE;
|
||||||
|
|||||||
Reference in New Issue
Block a user