Merge branch 'feature/ce'
This commit is contained in:
@@ -222,8 +222,6 @@ export function getVipRegretCnt(vipStartTime: number) {
|
||||
}
|
||||
|
||||
export function vipCanSkipTower(recommendCeSum: number, heroesCeSum: number, vipStartTime: number) {
|
||||
console.log('####', recommendCeSum, heroesCeSum, vipStartTime, );
|
||||
let ratio = vipStartTime > 0? VIP.VIP_TOWER_SKIP_CE_RATIO_WITH_VIP: VIP.VIP_TOWER_SKIP_CE_RATIO_WITHOUT_VIP;
|
||||
console.log('#####', VIP.VIP_TOWER_SKIP_CE_RATIO_WITH_VIP, VIP.VIP_TOWER_SKIP_CE_RATIO_WITHOUT_VIP, ratio)
|
||||
return heroesCeSum > recommendCeSum * ratio;
|
||||
}
|
||||
@@ -97,7 +97,7 @@ export function getDungeonBuyCountCost(num:number) {
|
||||
}
|
||||
|
||||
export async function saveDungeonFirst(role: RoleType, warId: number, battleRecord: BattleRecordType) {
|
||||
let userInfo = new RankParam(role, true);
|
||||
let userInfo = new RankParam(role);
|
||||
let lineup = battleRecord.record.lineup;
|
||||
let dicWar = gameData.war.get(warId);
|
||||
await DungeonFirstModel.createDungeonFirst(role.serverId, dicWar.movePoint, warId, {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { getRandEelm, } from '../pubUtils/util';
|
||||
import { EPlace, Stone } from "../db/Hero";
|
||||
import { gameData, getRandEffectByGroupAndLevel } from "../pubUtils/data";
|
||||
import { gameData, getJewelConditionByLvAndSeId, getRandEffectByGroupAndLevel } from "../pubUtils/data";
|
||||
import { JewelType, RandSe } from '../db/Jewel';
|
||||
import { DicRandomEffectPool } from '../pubUtils/dictionary/DicRandomEffectPool';
|
||||
import { getJewelRandSe } from './role/rewardService';
|
||||
@@ -126,4 +126,18 @@ export function getJewelByEquip(oldEquip: EPlace, newEquip: EPlace, jewels: Jewe
|
||||
let oldJewel = jewels.find(cur => cur && cur.seqId == oldEquip.jewel);
|
||||
let newJewel = jewels.find(cur => cur && cur.seqId == newEquip.jewel);
|
||||
return { oldJewel, newJewel }
|
||||
}
|
||||
|
||||
export function isRandSeUnLock(jewelId: number, randSeId: number, stones: Stone[]) {
|
||||
let dicJewel = gameData.jewel.get(jewelId);
|
||||
let dicJewelCondition = getJewelConditionByLvAndSeId(dicJewel.lv, randSeId);
|
||||
let stoneCnt = 0, stoneLv = 0;
|
||||
for(let { stone } of stones) {
|
||||
let dicStone = gameData.stone.get(stone);
|
||||
if(dicStone) {
|
||||
stoneCnt++;
|
||||
stoneLv += dicStone.lv;
|
||||
}
|
||||
}
|
||||
return stoneCnt >= dicJewelCondition.stoneCnt && stoneLv >= dicJewelCondition.stoneLv;
|
||||
}
|
||||
@@ -1,15 +1,16 @@
|
||||
|
||||
import { ExpeditionPointModel } from '../db/ExpeditionPoint';
|
||||
import Role, { CeAttrDataRole, RoleModel } from '../db/Role';
|
||||
import { shouldRefresh, calculateSumCE, getRandSingleEelm } from '../pubUtils/util';
|
||||
import Role, { RoleModel } from '../db/Role';
|
||||
import { shouldRefresh, getRandSingleEelm } from '../pubUtils/util';
|
||||
import { LINEUP_NUM, EXPEDITION_WAR_RECORD_STATUS } from '../consts';
|
||||
import { ExpeditionWarRecordModel } from '../db/ExpeditionWarRecord';
|
||||
import { CeAttrData, HeroType } from '../db/Hero';
|
||||
import { HeroType } from '../db/Hero';
|
||||
import { gameData } from '../pubUtils/data';
|
||||
import { getTimeFunD } from '../pubUtils/timeUtil';
|
||||
import { ExpeditionRecordModel } from '../db/ExpeditionRecord';
|
||||
import { Attribute, AttributeCal } from '../domain/roleField/attribute';
|
||||
import * as dicParam from '../pubUtils/dicParam';
|
||||
import { getHeroesAttributes, getSumCe } from './playerCeService';
|
||||
|
||||
/**
|
||||
* 获取远征关卡列表
|
||||
@@ -24,7 +25,7 @@ export async function getExpeditionStatus(roleId: string, roleName: string) {
|
||||
let expeditionRecord = await ExpeditionRecordModel.getCurRecord(roleId);
|
||||
if (!expeditionRecord) { // 首次新建一条记录
|
||||
// 我方战力
|
||||
let myCe = await calculateSumCE(roleId, 1, { num: LINEUP_NUM });
|
||||
let myCe = await getSumCe(roleId, LINEUP_NUM);
|
||||
expeditionRecord = await ExpeditionRecordModel.createRecord({
|
||||
roleId, roleName, heroes: [], myCe
|
||||
});
|
||||
@@ -136,7 +137,7 @@ export async function matchPlayers(roleId: string, scale: number, range: number,
|
||||
let index = Math.floor(Math.random() * resultRange.length);
|
||||
let role = resultRange[index];
|
||||
let {roleId, topLineup, topLineupCe } = role;
|
||||
let { attr: roleAttrs } = role;
|
||||
let attrByHid = await getHeroesAttributes(roleId);
|
||||
|
||||
enemyObj.enemyFrom = 1;
|
||||
enemyObj.enemyId = roleId;
|
||||
@@ -149,9 +150,10 @@ export async function matchPlayers(roleId: string, scale: number, range: number,
|
||||
if(hero) {
|
||||
let h = <HeroType>hero.hero;
|
||||
if(h) {
|
||||
let { star, lv, attr: heroAttrs, ce } = h;
|
||||
let { star, lv, ce } = h;
|
||||
let dicHero = gameData.hero.get(hero.hid);
|
||||
let { attribute } = getPlayerAttribute(lv, heroAttrs, roleAttrs);
|
||||
let attr = attrByHid.get(hero.hid);
|
||||
let attribute = attr.getAttributesToString();
|
||||
let heroInfo = {
|
||||
actorId: hero.hid,
|
||||
skinId: h.skinId,
|
||||
@@ -280,32 +282,18 @@ export async function getResetRemainCnt(curTime: Date, roleId: string, role?: Ro
|
||||
let newAttribute = new AttributeCal();
|
||||
newAttribute.setLv(lv);
|
||||
newAttribute.setByWarJson(subAttrs); // 次级属性
|
||||
let subAttrCe = newAttribute.calSubAttrCeAndReduce() * enemyCount;
|
||||
let subAttrCe = newAttribute.calSubAttrCe() * enemyCount;
|
||||
if(ce * ratio > subAttrCe) {
|
||||
let mainAttrCe = ce * ratio - subAttrCe;
|
||||
newAttribute.setByWarJson(mainAttrs, mainAttrCe / enemyCe);
|
||||
let attrArr = newAttribute.getReduceAttributesToString();
|
||||
let newCe = newAttribute.calCelAndReduce();
|
||||
let attrArr = newAttribute.getAttributesToString();
|
||||
let newCe = newAttribute.calCe();
|
||||
return { attribute: attrArr, ce: newCe };
|
||||
} else {
|
||||
newAttribute = new AttributeCal();
|
||||
newAttribute.setByWarJson(mainAttrs, ce * ratio / enemyCe);
|
||||
let attrArr = newAttribute.getReduceAttributesToString();
|
||||
let newCe = newAttribute.calCelAndReduce();
|
||||
let attrArr = newAttribute.getAttributesToString();
|
||||
let newCe = newAttribute.calCe();
|
||||
return { attribute: attrArr, ce: newCe };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 根据玩家数据获取到他的属性
|
||||
* @param ceAttr hero表的ceAttr
|
||||
* @param globalCeAttr role表中的globalCeAttr
|
||||
*/
|
||||
export function getPlayerAttribute(lv: number, heroAttrs: CeAttrData[] = [], roleAttrs: CeAttrDataRole[] = []) {
|
||||
let newAttribute = new AttributeCal();
|
||||
newAttribute.setLv(lv);
|
||||
newAttribute.setByDbData(roleAttrs, heroAttrs);
|
||||
let attribute = newAttribute.getReduceAttributesToString();
|
||||
let ce = newAttribute.calCelAndReduce();
|
||||
return { attribute, ce };
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
import { ServerlistModel } from "../../db/Serverlist";
|
||||
import { RoleModel } from "../../db/Role";
|
||||
import { reduceCe } from "../../pubUtils/util";
|
||||
import { GUILDACTIVITY } from "../../pubUtils/dicParam";
|
||||
import { gameData, getGuildAuctionRewards, getCityActivityRewards } from "../../pubUtils/data";
|
||||
import { getCurDay, nowSeconds, getTimeFun } from "../../pubUtils/timeUtil";
|
||||
@@ -82,7 +81,7 @@ export async function setPreDayActiveData() {
|
||||
}
|
||||
}
|
||||
|
||||
await ServerRecordModel.updateData(server.id, { activePlayerCnt, activePlayerCe: reduceCe(activePlayerCe), activePlayers, activeGuilds });
|
||||
await ServerRecordModel.updateData(server.id, { activePlayerCnt, activePlayerCe, activePlayers, activeGuilds });
|
||||
}
|
||||
return servers;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import { findIndex } from 'underscore';
|
||||
import { sismemberAsync, smembersAsync, saddAsync, delAsync, getRoleOnlineInfo } from '../services/redisService';
|
||||
import { pinus } from 'pinus';
|
||||
import { STATUS } from '../consts/statusCode';
|
||||
import { reduceCe, resResult, shouldRefresh } from '../pubUtils/util';
|
||||
import { resResult, shouldRefresh } from '../pubUtils/util';
|
||||
import { BattleRecordModel } from '../db/BattleRecord';
|
||||
import { getArmyBossRank, gameData, getAuctionRewardByPoolId } from '../pubUtils/data';
|
||||
import { sendMailToGuildByContent } from '../services/mailService';
|
||||
@@ -197,8 +197,6 @@ export async function getBossHp(serverId: number, guildCode: string, dicBossBase
|
||||
activeCe += activePlayers[i].topLineupCe;
|
||||
}
|
||||
}
|
||||
activeCe = reduceCe(activeCe);
|
||||
|
||||
console.log(`getBossHp activeCe ${activeCe}`);
|
||||
let B = activeCe/6/GUILDACTIVITY.GATEACTIVITY_ENEMYCE;
|
||||
console.log(`getBossHp B ${B}`);
|
||||
|
||||
@@ -4,7 +4,7 @@ import Role, { RoleModel, RoleType } from '../db/Role'
|
||||
import { getLvByExp, getExpByLv, gameData, getDicApByLv } from '../pubUtils/data';
|
||||
import { updateUserInfo } from './redisService';
|
||||
// import { switchOnFunc } from './funcSwitchService';
|
||||
import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE, STATUS, KING_EXP_RATIO_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE } from '../consts';
|
||||
import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE, STATUS, KING_EXP_RATIO_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, HERO_SYSTEM_TYPE } from '../consts';
|
||||
import { BackendSession, pinus } from 'pinus';
|
||||
import { REDIS_KEY } from '../consts';
|
||||
import { Rank } from './rankService';
|
||||
@@ -16,6 +16,7 @@ import { LineupParam } from '../domain/rank';
|
||||
import { WarStar } from '../domain/dbGeneral';
|
||||
import { uniq } from 'underscore';
|
||||
import { checkPopUpCondition } from './activity/popUpShopService';
|
||||
import { calculateCeWithRole } from './playerCeService';
|
||||
|
||||
export async function roleLevelup(type: KING_EXP_RATIO_TYPE, roleId: string, kingExp: number = 0, session: BackendSession) {
|
||||
const serverId = session.get('serverId');
|
||||
@@ -47,6 +48,7 @@ export async function roleLevelup(type: KING_EXP_RATIO_TYPE, roleId: string, kin
|
||||
await checkTask(serverId, roleId, session.get('sid'), TASK_TYPE.ROLE_LV, { oldLv: lv, lv: newLv });
|
||||
// 弹出礼包
|
||||
await checkPopUpCondition(serverId, roleId, POP_UP_SHOP_CONDITION_TYPE.LV_TO, { oldLv: lv, newLv })
|
||||
await calculateCeWithRole(HERO_SYSTEM_TYPE.ROLE_LV, roleId, serverId, sid, { lv: newLv });
|
||||
|
||||
}
|
||||
let actordata: { lv: number, exp: number, getExp: number, mostExp: number }[] = [];
|
||||
|
||||
@@ -5,78 +5,358 @@
|
||||
import { pinus } from 'pinus';
|
||||
import { STATUS } from '../consts/statusCode';
|
||||
|
||||
import { resResult, reduceCe } from '../pubUtils/util';
|
||||
import { calPlayerCeAndSave as pubCalPlayerCeAndSave, reCalAllHeroCe } from '../pubUtils/playerCe';
|
||||
import { HeroType, HeroUpdate } from '../db/Hero';
|
||||
import { resResult } from '../pubUtils/util';
|
||||
import { HeroModel, HeroType, HeroUpdate } from '../db/Hero';
|
||||
|
||||
import { RoleUpdate, RoleType } from '../db/Role';
|
||||
import { RoleUpdate, RoleType, RoleModel } from '../db/Role';
|
||||
import { Rank } from './rankService';
|
||||
import { REDIS_KEY } from '../consts';
|
||||
import { HERO_SYSTEM_TYPE, REDIS_KEY } from '../consts';
|
||||
import { updateUserInfo } from './redisService';
|
||||
import { GuildType } from '../db/Guild';
|
||||
import { GuildModel, GuildType } from '../db/Guild';
|
||||
import { CalCe } from './role/calCe';
|
||||
import { RoleCeModel } from '../db/RoleCe';
|
||||
import { PvpDefenseModel } from '../db/PvpDefense';
|
||||
import { saveCeChangeLog } from '../pubUtils/logUtil';
|
||||
import { JewelType } from '../db/Jewel';
|
||||
import { SchoolModel } from '../db/School';
|
||||
import { AttributeCal } from '../domain/roleField/attribute';
|
||||
|
||||
interface calPlayerReturn {
|
||||
serverId: number;
|
||||
role: RoleType;
|
||||
guild?: GuildType;
|
||||
hero?: HeroType;
|
||||
pushHeros: {hid: number, ce: number, incHeroCe: number}[];
|
||||
topLineupCe: number;
|
||||
heros?: HeroType[]
|
||||
interface Param {
|
||||
isInitRole?: boolean,
|
||||
hid?: number,
|
||||
hero?: HeroType,
|
||||
isUpStar?: boolean,
|
||||
shipId?: number,
|
||||
isFavourLvUp?: boolean,
|
||||
ePlaceId?: number,
|
||||
ePlaceIds?: number[],
|
||||
jewels?: JewelType[],
|
||||
jewel?: JewelType,
|
||||
teraphId?: number,
|
||||
schoolId?: number,
|
||||
schoolHid?: number,
|
||||
preSchoolHid?: number,
|
||||
skinId?: number,
|
||||
}
|
||||
|
||||
//修改并下发战力
|
||||
export async function calPlayerCeAndSave(type: number, sid: string, roleId: string, originHero: HeroType, update: HeroUpdate, args?: Array<number>, params?: any) {
|
||||
let result = await pubCalPlayerCeAndSave(type, roleId, originHero, update, args, params);
|
||||
return await pushCalPlayerCe(roleId, sid, result);
|
||||
export async function calculateCeWithHero(type: HERO_SYSTEM_TYPE, roleId: string, serverId: number, sid: string, hid: number, heroUpdate: HeroUpdate, param: Param = {}) {
|
||||
let heroUpdates = new Map<number, HeroUpdate>();
|
||||
heroUpdates.set(hid, heroUpdate);
|
||||
let { heroes, curRole } = await calculateCes(type, roleId, serverId, sid, heroUpdates, {}, {}, param);
|
||||
let curHero = heroes.find(cur => cur.hid == hid);
|
||||
return { heroes, curHero, curRole }
|
||||
}
|
||||
|
||||
// 修改后战力的推送
|
||||
export async function pushCalPlayerCe(roleId: string, sid: string, calResult: calPlayerReturn) {
|
||||
let {role, pushHeros, topLineupCe, hero, guild, serverId} = calResult;
|
||||
// console.log(JSON.stringify(pushHeros))
|
||||
//下发战力
|
||||
export async function calculateCeWithRole(type: HERO_SYSTEM_TYPE, roleId: string, serverId: number, sid: string, roleUpdate: RoleUpdate, param: Param = {}) {
|
||||
let { heroes, curRole } = await calculateCes(type, roleId, serverId, sid, new Map(), roleUpdate, {}, param);
|
||||
return { heroes, curRole };
|
||||
}
|
||||
|
||||
export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serverId: number, sid: string, heroUpdates: Map<number, HeroUpdate>, roleUpdate: RoleUpdate, roleIncUpdate: RoleUpdate, param: Param = {}) {
|
||||
let calCe = new CalCe(roleId);
|
||||
let roleCe = await RoleCeModel.findByRoleId(roleId);
|
||||
calCe.setRoleCe(roleCe);
|
||||
switch (type) {
|
||||
case HERO_SYSTEM_TYPE.INIT:
|
||||
{
|
||||
for(let [hid, { skinId, lv, quality, star, starStage, colorStar, colorStarStage, job, jobStage, }] of heroUpdates) {
|
||||
calCe.setHeroBase(hid, skinId);
|
||||
calCe.setHeroLv(hid, lv);
|
||||
calCe.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage);
|
||||
calCe.setJob(hid, job, jobStage);
|
||||
}
|
||||
console.log('####### roleUpdate', param.isInitRole, roleUpdate)
|
||||
if(param.isInitRole) {
|
||||
let { title, teraphs, lv } = roleUpdate;
|
||||
calCe.setRoleLv(lv)
|
||||
calCe.setTitle(title);
|
||||
calCe.setTeraph(teraphs);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.LVUP: // 1. 升级
|
||||
{
|
||||
for(let [hid, { lv }] of heroUpdates) {
|
||||
calCe.setHeroLv(hid, lv);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.STAR: // 2. 升星
|
||||
{
|
||||
for(let [hid, { star, starStage }] of heroUpdates) {
|
||||
let { hero: { quality, job, colorStar, colorStarStage }, isUpStar } = param;
|
||||
await treatHeroStar(calCe, roleId, hid, star, starStage, quality, colorStar, colorStarStage, job, isUpStar);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.QUALITY: // 3. 升品
|
||||
{
|
||||
for(let [hid, { quality }] of heroUpdates) {
|
||||
let { hero: { star, starStage, colorStar, colorStarStage, job } } = param;
|
||||
await treatHeroStar(calCe, roleId, hid, star, starStage, quality, colorStar, colorStarStage, job, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.COLORSTAR: // 4. 觉醒
|
||||
{
|
||||
for(let [hid, { quality, colorStar, colorStarStage }] of heroUpdates) {
|
||||
let { hero: { star, starStage, job }, isUpStar } = param;
|
||||
await treatHeroStar(calCe, roleId, hid, star, starStage, quality, colorStar, colorStarStage, job, isUpStar);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.TRAIN: // 5. 训练
|
||||
case HERO_SYSTEM_TYPE.STAGEUP: // 6. 职业进阶
|
||||
{
|
||||
for(let [hid, { job, jobStage }] of heroUpdates) {
|
||||
calCe.setJob(hid, job, jobStage);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.SKIN: // 7. 穿皮肤
|
||||
{
|
||||
let { hero: { quality, star, starStage, colorStar, colorStarStage, skins } } = param;
|
||||
for(let [hid, { skinId, job, ePlace }] of heroUpdates) {
|
||||
calCe.setHeroBase(hid, skinId);
|
||||
calCe.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage);
|
||||
for(let { id, equipId, quality, qualityStage, lv, star, starStage } of ePlace) {
|
||||
calCe.setEquipQuality(hid, id, equipId, quality, qualityStage);
|
||||
calCe.setEquipStrength(hid, id, equipId, lv);
|
||||
calCe.setEquipStar(hid, id, equipId, star, starStage);
|
||||
}
|
||||
calCe.setTalent(hid, skins);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.FAVOUR: // 8. 好感度
|
||||
{
|
||||
let { hero: { connections }, isFavourLvUp } = param;
|
||||
console.log('####', connections, isFavourLvUp, heroUpdates)
|
||||
if(isFavourLvUp) {
|
||||
for(let [hid, { favourLv }] of heroUpdates) {
|
||||
calCe.setFavour(hid, favourLv, connections);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.CONNECT: // 9. 羁绊
|
||||
{
|
||||
for(let [ hid, { connections } ] of heroUpdates) {
|
||||
let { shipId } = param;
|
||||
calCe.setConnection(hid, shipId, connections);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.ADD_SKIN: // 15. 第一次获得皮肤
|
||||
{
|
||||
let { skinId } = param;
|
||||
calCe.setAddSkin(skinId);
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.SCHOOL: // 16. 放百家学宫
|
||||
{
|
||||
let { schoolId, schoolHid, preSchoolHid, hero } = param;
|
||||
if(preSchoolHid) {
|
||||
calCe.setSchool(false, preSchoolHid, schoolId, 0, 0, 0);
|
||||
}
|
||||
if(schoolHid) {
|
||||
let { star, colorStar, quality } = hero;
|
||||
calCe.setSchool(true, schoolHid, schoolId, star, colorStar, quality);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.SCROLL: // 17. 名将谱
|
||||
{
|
||||
for(let [hid, { scrollStar, scrollQuality, scrollColorStar }] of heroUpdates) {
|
||||
calCe.setScroll(hid, scrollStar, scrollQuality, scrollColorStar);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.TITLE: // 18. 爵位
|
||||
{
|
||||
let { title } = roleUpdate;
|
||||
calCe.setTitle(title);
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.TERAPH: // 19. 神像
|
||||
case HERO_SYSTEM_TYPE.TERAPH_UP: // 20. 神像进阶
|
||||
{
|
||||
let { teraphs } = roleUpdate;
|
||||
calCe.setTeraph(teraphs);
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.COMPOSE_EQUIP: // 21. 合成装备
|
||||
{
|
||||
let { ePlaceId } = param;
|
||||
for(let [hid, { ePlace = [] }] of heroUpdates) {
|
||||
for(let { id, equipId, quality, qualityStage, lv, star, starStage } of ePlace) {
|
||||
if(ePlaceId == id) {
|
||||
calCe.setEquipQuality(hid, id, equipId, quality, qualityStage);
|
||||
calCe.setEquipStrength(hid, id, equipId, lv);
|
||||
calCe.setEquipStar(hid, id, equipId, star, starStage);
|
||||
}
|
||||
}
|
||||
calCe.setEquipSuit(hid, ePlace);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.EQUIP_STRENGTH: // 22. 装备强化
|
||||
{
|
||||
let { ePlaceIds } = param;
|
||||
for(let [hid, { ePlace = [] }] of heroUpdates) {
|
||||
for(let { id, equipId, lv } of ePlace) {
|
||||
if(ePlaceIds.indexOf(id) != -1) {
|
||||
calCe.setEquipStrength(hid, id, equipId, lv);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.EQUIP_QUALITY: // 23. 装备升品
|
||||
{
|
||||
let { ePlaceId } = param;
|
||||
for(let [hid, { ePlace = [] }] of heroUpdates) {
|
||||
for(let { id, equipId, quality, qualityStage } of ePlace) {
|
||||
if(ePlaceId == id) {
|
||||
calCe.setEquipQuality(hid, id, equipId, quality, qualityStage);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.EQUIP_STAR: // 24. 装备升星
|
||||
{
|
||||
let { ePlaceId } = param;
|
||||
for(let [hid, { ePlace = [] }] of heroUpdates) {
|
||||
for(let { id, equipId, star, starStage } of ePlace) {
|
||||
if(ePlaceId == id) {
|
||||
calCe.setEquipStar(hid, id, equipId, star, starStage);
|
||||
}
|
||||
}
|
||||
calCe.setEquipSuit(hid, ePlace);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.EQUIP_JEWEL: // 25. 装备天晶
|
||||
case HERO_SYSTEM_TYPE.JEWEL_RESET_RANDSE: // 27. 洗练
|
||||
case HERO_SYSTEM_TYPE.JEWEL_QUENCH: // 28. 淬炼
|
||||
{
|
||||
let { ePlaceId, jewel: curJewel } = param;
|
||||
for(let [hid, { ePlace = [] }] of heroUpdates) {
|
||||
for(let { id, stones } of ePlace) {
|
||||
if(ePlaceId == id) {
|
||||
calCe.setJewel(hid, id, stones, curJewel);
|
||||
}
|
||||
}
|
||||
calCe.setEquipSuit(hid, ePlace);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.EQUIP_STONE: // 26. 装备地玉
|
||||
{
|
||||
let { ePlaceId, jewel: curJewel } = param;
|
||||
for(let [hid, { ePlace = [] }] of heroUpdates) {
|
||||
for(let { id, stones } of ePlace) {
|
||||
if(ePlaceId == id) {
|
||||
calCe.setJewel(hid, id, stones, curJewel);
|
||||
}
|
||||
}
|
||||
calCe.setEquipSuit(hid, ePlace);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.REBIRTH: // 29. 重生
|
||||
{
|
||||
for(let [hid, { skinId, lv, quality, star, starStage, colorStar, colorStarStage, job, jobStage, skins, ePlace, scrollStar, scrollQuality, scrollColorStar }] of heroUpdates) {
|
||||
calCe.setHeroBase(hid, skinId);
|
||||
calCe.setHeroLv(hid, lv);
|
||||
calCe.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage);
|
||||
calCe.setJob(hid, job, jobStage);
|
||||
|
||||
for(let { id, equipId, quality, qualityStage, lv, star, starStage } of ePlace) {
|
||||
calCe.setEquipQuality(hid, id, equipId, quality, qualityStage);
|
||||
calCe.setEquipStrength(hid, id, equipId, lv);
|
||||
calCe.setEquipStar(hid, id, equipId, star, starStage);
|
||||
}
|
||||
calCe.setTalent(hid, skins);
|
||||
calCe.setScroll(hid, scrollStar, scrollQuality, scrollColorStar);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.TALENT: // 30. 天赋
|
||||
{
|
||||
for(let [hid, { skins }] of heroUpdates) {
|
||||
calCe.setTalent(hid, skins);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.ROLE_LV: // 31. 玩家等级
|
||||
{
|
||||
let { lv } = roleUpdate;
|
||||
calCe.setRoleLv(lv);
|
||||
break;
|
||||
}
|
||||
}
|
||||
let { heroCe, roleInc } = calCe.getCeInc(); // 计算战力,获得有变化的武将战力
|
||||
let changeHids: number[] = [];
|
||||
let pushHeros = new Array<{ hid: number, ce: number, incHeroCe: number }>();
|
||||
let heroes: HeroType[] = [];
|
||||
|
||||
for(let [hid, heroUpdate] of heroUpdates) {
|
||||
if(heroCe.has(hid)) {
|
||||
let { ce, inc } = heroCe.get(hid);
|
||||
let heroUpdate = heroUpdates.get(hid)||{};
|
||||
let hero = await HeroModel.updateHeroInfo(roleId, hid, { ...heroUpdate, ce });
|
||||
calCe.setResultHero(hero);
|
||||
heroes.push(hero);
|
||||
await PvpDefenseModel.updateCe(roleId, hid, inc); // 更新pvp防守阵战力
|
||||
pushHeros.push({ hid, ce, incHeroCe: inc });
|
||||
changeHids.push(hid);
|
||||
} else {
|
||||
let hero = await HeroModel.updateHeroInfo(roleId, hid, heroUpdate);
|
||||
heroes.push(hero);
|
||||
}
|
||||
}
|
||||
for(let [hid, { ce, inc }] of heroCe) {
|
||||
if(changeHids.indexOf(hid) == -1) {
|
||||
let hero = await HeroModel.updateHeroInfo(roleId, hid, { ce });
|
||||
pushHeros.push({ hid, ce: hero.ce, incHeroCe: inc });
|
||||
changeHids.push(hid);
|
||||
}
|
||||
}
|
||||
|
||||
let { topLineup, topLineupCe } = calCe.getTopLineup();
|
||||
let roleCeUpdate = calCe.getRoleCeTable();
|
||||
roleCe = await RoleCeModel.updateRoleCe(roleId, roleCeUpdate);
|
||||
let role = await RoleModel.incRoleInfo(roleId, { ...roleIncUpdate, ce: roleInc }, { ...roleUpdate, topLineup, topLineupCe });
|
||||
let guild = await GuildModel.updateCe(roleId, roleInc); // 公会更新战力
|
||||
|
||||
saveCeChangeLog(role, roleInc, role.ce, type, changeHids);
|
||||
updateRank(roleId, serverId, topLineupCe, role, pushHeros, guild);
|
||||
|
||||
let uids = [{ uid: roleId, sid }];
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(role.ce) , heros: pushHeros, topLineupCe: reduceCe(topLineupCe) }), uids);
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: role.ce, heros: pushHeros, topLineupCe }), uids);
|
||||
|
||||
if(guild) {
|
||||
await updateUserInfo(REDIS_KEY.GUILD_INFO, guild.code, [{ field: 'guildCe', value: guild.guildCe }]);
|
||||
}
|
||||
updateRank(roleId, serverId, topLineupCe, role, pushHeros);
|
||||
|
||||
return hero;
|
||||
return { heroes, curRole: role }
|
||||
}
|
||||
|
||||
// 修改全局战力并下发
|
||||
export async function calAllHeroCe(type:number, sid: string, roleId: string, update: RoleUpdate, args?:Array<number>, params?: any) {
|
||||
let result = await reCalAllHeroCe(type, roleId, update, args, params);
|
||||
if(result.pushHeros.length > 0) {
|
||||
return await pushCalAllHeroCe(roleId, sid, result);
|
||||
} else {
|
||||
return result;
|
||||
async function treatHeroStar(calCe: CalCe, roleId: string, hid: number, star: number, starStage: number, quality: number, colorStar: number, colorStarStage: number, job: number, isUpStar: boolean) {
|
||||
calCe.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage);
|
||||
if(isUpStar) {
|
||||
let school = await SchoolModel.findByHid(roleId, hid);
|
||||
if(school) calCe.setSchool(true, hid, school.schoolId, star, colorStar, quality);
|
||||
}
|
||||
}
|
||||
|
||||
// 修改全局战力的推送
|
||||
export async function pushCalAllHeroCe(roleId: string, sid: string, calResult: calPlayerReturn) {
|
||||
let {role, pushHeros, topLineupCe, guild, serverId } = calResult;
|
||||
let uids = [{ uid: roleId, sid }];
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(role.ce), heros: pushHeros, topLineupCe: reduceCe(topLineupCe) }), uids);
|
||||
|
||||
if(guild) {
|
||||
await updateUserInfo(REDIS_KEY.GUILD_INFO, guild.code, [{ field: 'guildCe', value: guild.guildCe }]);
|
||||
}
|
||||
updateRank(roleId, serverId, topLineupCe, role, pushHeros);
|
||||
|
||||
return calResult;
|
||||
}
|
||||
|
||||
|
||||
// 更新排行榜数据
|
||||
async function updateRank(roleId: string, serverId: number, topLineupCe: number, role: RoleType, pushHeros: {hid: number, ce: number}[]) {
|
||||
async function updateRank(roleId: string, serverId: number, topLineupCe: number, role: RoleType, pushHeros: {hid: number, ce: number}[], guild?: GuildType) {
|
||||
|
||||
// 最强阵容
|
||||
let r = new Rank(REDIS_KEY.TOP_LINEUP_RANK, { serverId });
|
||||
await r.setRankWithRoleInfo(roleId, reduceCe(topLineupCe), 0, role);
|
||||
await r.setRankWithRoleInfo(roleId, topLineupCe, 0, role);
|
||||
|
||||
// 最强武将
|
||||
for(let { hid, ce } of pushHeros) {
|
||||
@@ -89,9 +369,39 @@ async function updateRank(roleId: string, serverId: number, topLineupCe: number,
|
||||
|
||||
// 总战力
|
||||
let r3 = new Rank(REDIS_KEY.SUM_CE_RANK, { serverId });
|
||||
await r3.setRankWithRoleInfo(roleId, reduceCe(role.ce), 0, role);
|
||||
await r3.setRankWithRoleInfo(roleId, role.ce, 0, role);
|
||||
|
||||
// 更新最强五人阵容信息
|
||||
let r5 = new Rank(REDIS_KEY.TOP_LINEUP_INFO, { serverId });
|
||||
await r5.generParamAndSet(REDIS_KEY.TOP_LINEUP_INFO, { roleId }, { role });
|
||||
|
||||
if(guild) {
|
||||
await updateUserInfo(REDIS_KEY.GUILD_INFO, guild.code, [{ field: 'guildCe', value: guild.guildCe }]);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getSumCe(roleId: string, num: number) {
|
||||
let roleCe = await RoleCeModel.findByRoleId(roleId);
|
||||
let calCe = new CalCe(roleId);
|
||||
calCe.setRoleCe(roleCe);
|
||||
let arr = calCe.getResultCeArr();
|
||||
let ce = 0;
|
||||
for(let i = 0; i < num; i++) {
|
||||
if(arr[i]) {
|
||||
ce += arr[i].ce;
|
||||
}
|
||||
}
|
||||
return ce;
|
||||
}
|
||||
|
||||
export async function getHeroesAttributes(roleId: string) {
|
||||
let roleCe = await RoleCeModel.findByRoleId(roleId);
|
||||
let attrByHid = new Map<number, AttributeCal>();
|
||||
for(let { hid, attrs } of roleCe.attributes||[]) {
|
||||
let cal = new AttributeCal();
|
||||
cal.setLv(roleCe.roleLv);
|
||||
cal.setByWarJson(attrs);
|
||||
attrByHid.set(hid, cal);
|
||||
}
|
||||
return attrByHid;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
import { PvpDefenseModel, PvpDefenseType, pvpUpdateInter } from '../db/PvpDefense';
|
||||
import { Defense, Attack, LineupCe, OppPlayer, HeroScore, HeroReward, OppPlayerReturn, AttackHero, DefenseHero } from '../domain/battleField/pvp';
|
||||
import { RoleType, CeAttrDataRole } from '../db/Role';
|
||||
import { RoleType } from '../db/Role';
|
||||
import { PVP_HERO_POS, REDIS_KEY, PVP_CONST, COUNTER, TASK_TYPE, MAIL_TYPE, TA_EVENT } from '../consts';
|
||||
import { dicPvpOpponent, DicPvpOpponent } from "../pubUtils/dictionary/DicPvpOpponent";
|
||||
import { getRandSingleIndex, genCode, shouldRefresh, getChineseName, makeRobotId, robotIdComBack, getRandSingleEelm } from '../pubUtils/util';
|
||||
@@ -11,7 +11,7 @@ import { PVP } from '../pubUtils/dicParam';
|
||||
import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig'
|
||||
import { nowSeconds, getTimeFun } from '../pubUtils/timeUtil';
|
||||
import { HeroesRecord, PvpRecordPlayerInfo } from '../db/PvpRecord';
|
||||
import { HeroModel, CeAttrData, HeroType } from '../db/Hero';
|
||||
import { HeroModel, HeroType } from '../db/Hero';
|
||||
import { AttributeCal } from '../domain/roleField/attribute';
|
||||
import { PvpEnemies, PvpHeroInfo, PvpOtherHeroes } from '../domain/dbGeneral';
|
||||
import { DicWarJson } from '../pubUtils/dictionary/DicWarJson';
|
||||
@@ -27,6 +27,7 @@ import { sendMailByContent } from './mailService';
|
||||
import { RoleRankInfo } from '../domain/rank';
|
||||
import { reportTAEvent } from './sdkService';
|
||||
import { getVipPvpChallengeMaxCnt } from './activity/monthlyTicketService';
|
||||
import { getHeroesAttributes } from './playerCeService';
|
||||
|
||||
/**
|
||||
* 返回对手三人信息
|
||||
@@ -61,7 +62,6 @@ export async function getEnemies(oppPlayers: OppPlayer[], winStreakNum: number)
|
||||
* @param pLv 我的排名
|
||||
*/
|
||||
export async function refreshEnemies(role: RoleType, seasonNum: number, sumScore: number, score: number, pLv: number) {
|
||||
console.log('#####',seasonNum, sumScore, score, pLv)
|
||||
let { roleId } = role;
|
||||
let chosenOpps: string[] = [];
|
||||
let pvpHistoryOppParam: PvpOppCreateParam[] = [];
|
||||
@@ -204,6 +204,7 @@ async function generPlayerOppHis(pvpdefense: PvpDefenseType, roleId: string, pos
|
||||
let heroes = new Array<PvpEnemies>();
|
||||
let otherHeroes = new Array<PvpOtherHeroes>(); // 阵容外的所有武将信息
|
||||
let defCe = 0;
|
||||
let attrByHid = await getHeroesAttributes(role.roleId);
|
||||
for (let dbHero of dbHeroes) {
|
||||
let h = defenseHeroes.find(cur => cur.actorId == dbHero.hid); // 阵容里是否有这个武将
|
||||
let hs = heroScores.find(cur => cur.hid == dbHero.hid); // 这个武将是否有这个得分
|
||||
@@ -214,7 +215,10 @@ async function generPlayerOppHis(pvpdefense: PvpDefenseType, roleId: string, pos
|
||||
let heroInfo = new PvpHeroInfo();
|
||||
heroInfo.setHeroInfo(dbHero);
|
||||
// heroInfo.setOutIndex(h.order);
|
||||
let { attribute, ce } = getPlayerAttribute(dbHero.lv, dbHero.attr, role.attr);
|
||||
let attr = attrByHid.get(h.actorId);
|
||||
if(!attr) continue;
|
||||
let attribute = attr.getAttributesToString();
|
||||
let ce = attr.calCe();
|
||||
heroInfo.setAttribute(attribute);
|
||||
let enemy = new PvpEnemies(warJson, heroInfo, hs ? hs.score : 0, ce);
|
||||
enemy.setOutIndex(h.order);
|
||||
@@ -373,37 +377,11 @@ export function getRobotAttribute(hid: number, posRatio: number, score: number)
|
||||
let newAttribute = new AttributeCal();
|
||||
newAttribute.setLv(difficultRatio.enemyLv);
|
||||
newAttribute.setByMap(dicHero.baseAbilityArr, difficultRatio.value / 10000 * posRatio);
|
||||
let attrArr = newAttribute.getReduceAttributesToString();
|
||||
let newCe = newAttribute.calCelAndReduce();
|
||||
let attrArr = newAttribute.getAttributesToString();
|
||||
let newCe = newAttribute.calCe();
|
||||
return { attribute: attrArr, ce: newCe, lv: difficultRatio.enemyLv };
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 根据玩家数据获取到他的属性
|
||||
* @param ceAttr hero表的ceAttr
|
||||
* @param globalCeAttr role表中的globalCeAttr
|
||||
*/
|
||||
export function getPlayerAttribute(lv: number, heroAttrs: CeAttrData[] = [], roleAttrs: CeAttrDataRole[] = []) {
|
||||
let newAttribute = new AttributeCal();
|
||||
newAttribute.setLv(lv);
|
||||
newAttribute.setByDbData(roleAttrs, heroAttrs);
|
||||
let attribute = newAttribute.getReduceAttributesToString();
|
||||
let ce = newAttribute.calCelAndReduce();
|
||||
return { attribute, ce };
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 根据玩家数据获取到他的主属性
|
||||
* @param ceAttr
|
||||
* @param globalCeAttr
|
||||
*/
|
||||
export function getPlayerMainAttribute(heroAttrs: CeAttrData[], roleAttrs: CeAttrDataRole[]) {
|
||||
let newAttribute = new AttributeCal();
|
||||
newAttribute.setByDbData(roleAttrs, heroAttrs);
|
||||
let mainAttributes = newAttribute.getReduceMainAttributes();
|
||||
return mainAttributes;
|
||||
}
|
||||
|
||||
// 获取我方战报记录
|
||||
export async function generMyRecInfo(pvpDefense: PvpDefenseType, role: RoleType, isSuccess: boolean, pos: number, myHeroes: pvpEndParamInter[]) {
|
||||
let { attack, defense, heroScores, winStreakNum, hisWinStreakNum = 0, score, hisScore } = pvpDefense;
|
||||
|
||||
@@ -243,13 +243,13 @@ export class Rank {
|
||||
if (!role) {
|
||||
role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.RANK, true);
|
||||
}
|
||||
let param = new RankParam(role, true);
|
||||
let param = new RankParam(role);
|
||||
await this.setUserInfo(infoKey, { roleId }, param);
|
||||
} else if (infoKey == REDIS_KEY.GUILD_INFO) {
|
||||
if (!guild) {
|
||||
guild = await GuildModel.findByCode(guildCode, this.keyName.serverId, GUILD_SELECT.RANK)
|
||||
}
|
||||
let param = new GuildRankParam(guild, true);
|
||||
let param = new GuildRankParam(guild);
|
||||
await this.setUserInfo(infoKey, { guildCode }, param);
|
||||
} else if (infoKey == REDIS_KEY.TOP_LINEUP_INFO) {
|
||||
if (!role) {
|
||||
@@ -436,13 +436,13 @@ export class Rank {
|
||||
if (!role) {
|
||||
role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.RANK, true);
|
||||
}
|
||||
param = new RoleRankInfo(role, true);
|
||||
param = new RoleRankInfo(role);
|
||||
param.setInfo(0, { roleId }, score, time);
|
||||
} else {
|
||||
const info = await redisClient().hgetAsync(this.infoKey, roleId);
|
||||
const userInfo = JSON.parse(info);
|
||||
|
||||
param = new RoleRankInfo(userInfo, false);
|
||||
param = new RoleRankInfo(userInfo);
|
||||
param.setInfo(0, { roleId }, score, time);
|
||||
}
|
||||
|
||||
@@ -462,12 +462,12 @@ export class Rank {
|
||||
if (!guild) {
|
||||
guild = await GuildModel.findByCode(guildCode, this.keyName.serverId, GUILD_SELECT.RANK);
|
||||
}
|
||||
param = new GuildRankInfo(guild, true);
|
||||
param = new GuildRankInfo(guild);
|
||||
param.setInfo(0, { guildCode }, score, time);
|
||||
} else {
|
||||
const info = await redisClient().hgetAsync(this.infoKey, guildCode);
|
||||
const guildInfo = JSON.parse(info);
|
||||
param = new GuildRankInfo(guildInfo, false);
|
||||
param = new GuildRankInfo(guildInfo);
|
||||
param.setInfo(0, { guildCode }, score, time);
|
||||
}
|
||||
|
||||
@@ -487,12 +487,12 @@ export class Rank {
|
||||
if (!guild) {
|
||||
guild = await GuildModel.findByCode(guildCode, this.keyName.serverId, GUILD_SELECT.RANK);
|
||||
}
|
||||
param = new GuildRankInfo(guild, true);
|
||||
param = new GuildRankInfo(guild);
|
||||
param.setInfo2(0, { guildCode }, score, time, active);
|
||||
} else {
|
||||
const info = await redisClient().hgetAsync(this.infoKey, guildCode);
|
||||
const guildInfo = JSON.parse(info);
|
||||
param = new GuildRankInfo(guildInfo, false);
|
||||
param = new GuildRankInfo(guildInfo);
|
||||
param.setInfo2(0, { guildCode }, score, time, active);
|
||||
}
|
||||
|
||||
@@ -512,13 +512,13 @@ export class Rank {
|
||||
if (!role) {
|
||||
role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.RANK, true);
|
||||
}
|
||||
param = new RoleRankInfo(role, true);
|
||||
param = new RoleRankInfo(role);
|
||||
param.setInfo(0, { roleId, hid }, score, time);
|
||||
} else {
|
||||
const info = await redisClient().hgetAsync(this.infoKey, roleId);
|
||||
const userInfo = JSON.parse(info);
|
||||
|
||||
param = new RoleRankInfo(userInfo, false);
|
||||
param = new RoleRankInfo(userInfo);
|
||||
param.setInfo(0, { roleId, hid }, score, time);
|
||||
}
|
||||
|
||||
@@ -710,14 +710,14 @@ export class Rank {
|
||||
if (nowSeconds() - userInfo.updatedAt > 2 * 30 * 24 * 60 * 60) {
|
||||
continue;
|
||||
}
|
||||
param = new RoleRankInfo(userInfo, false);
|
||||
param = new RoleRankInfo(userInfo);
|
||||
param.setInfo(Math.floor(ii / 2) + 1, myId, scores[0], scores[1]);
|
||||
} else if (this.infoKey == REDIS_KEY.GUILD_INFO) {
|
||||
if(this.key == REDIS_KEY.GUILD_LV_RANK) {
|
||||
param = new GuildRankInfo(userInfo, false);
|
||||
param = new GuildRankInfo(userInfo);
|
||||
param.setInfo2(Math.floor(ii / 2) + 1, myId, scores[0], scores[1], scores[2]);
|
||||
} else {
|
||||
param = new GuildRankInfo(userInfo, false);
|
||||
param = new GuildRankInfo(userInfo);
|
||||
param.setInfo(Math.floor(ii / 2) + 1, myId, scores[0], scores[1]);
|
||||
}
|
||||
}
|
||||
@@ -759,14 +759,14 @@ export class Rank {
|
||||
if (nowSeconds() - userInfo.updatedAt > 2 * 30 * 24 * 60 * 60) {
|
||||
continue;
|
||||
}
|
||||
param = new RoleRankInfo(userInfo, false);
|
||||
param = new RoleRankInfo(userInfo);
|
||||
param.setInfo(Math.floor(ii / 2) + 1, myId, scores[0], scores[1]);
|
||||
} else if (this.infoKey == REDIS_KEY.GUILD_INFO) {
|
||||
if(this.key == REDIS_KEY.GUILD_LV_RANK) {
|
||||
param = new GuildRankInfo(userInfo, false);
|
||||
param = new GuildRankInfo(userInfo);
|
||||
param.setInfo2(Math.floor(ii / 2) + 1, myId, scores[0], scores[1], scores[2]);
|
||||
} else {
|
||||
param = new GuildRankInfo(userInfo, false);
|
||||
param = new GuildRankInfo(userInfo);
|
||||
param.setInfo(Math.floor(ii / 2) + 1, myId, scores[0], scores[1]);
|
||||
}
|
||||
}
|
||||
@@ -1083,7 +1083,7 @@ export async function getGeneralRank(role: RoleType & { rankReceived: number[] }
|
||||
let r = new Rank(redisKey, { serverId }, false, 1);
|
||||
let ranks = await r.getRankByRange();
|
||||
// if (ranks.length > 0) {
|
||||
let param = new GeneralRankParam(id, ranks[0] || new RoleRankInfo({}, false), general, received);
|
||||
let param = new GeneralRankParam(id, ranks[0] || new RoleRankInfo({}), general, received);
|
||||
result.push({...param, general});
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,218 +1,17 @@
|
||||
import { FIGURE_UNLOCK_CONDITION, ITEM_CHANGE_REASON, REDIS_KEY, STATUS, TASK_TYPE, HERO_SYSTEM_TYPE } from "../../consts";
|
||||
import { FIGURE_UNLOCK_CONDITION, ITEM_CHANGE_REASON, REDIS_KEY, STATUS, TASK_TYPE, HERO_SYSTEM_TYPE, LINEUP_NUM, COUNTER } from "../../consts";
|
||||
import { SkinModel } from "../../db/Skin";
|
||||
import { HeroModel, HeroSkin, HeroType, HeroUpdate } from "../../db/Hero";
|
||||
import { RoleModel, RoleType, RoleUpdate } from "../../db/Role";
|
||||
import { SkinUpdate } from "../../db/Skin";
|
||||
import { Figure, TopHero } from "../../domain/dbGeneral";
|
||||
import { TaskListReturn } from "../../domain/roleField/task";
|
||||
import { GuildModel, GuildType } from "../../db/Guild";
|
||||
import { PvpDefenseModel } from "../../db/PvpDefense";
|
||||
import { pick } from "underscore";
|
||||
import { calculatetopLineup } from "../../pubUtils/playerCe";
|
||||
import { nowSeconds } from "../../pubUtils/timeUtil";
|
||||
import { saveCeChangeLog } from "../../pubUtils/logUtil";
|
||||
import { getRandSingleEelm, reduceCe, resResult } from "../../pubUtils/util";
|
||||
import { AttributeCal } from "../../domain/roleField/attribute";
|
||||
import { CreateHeroParam, HeroParam, HeroShowParam } from "../../domain/roleField/hero";
|
||||
import { resResult } from "../../pubUtils/util";
|
||||
import { CreateHeroParam, HeroShowParam } from "../../domain/roleField/hero";
|
||||
import { pinus } from "pinus";
|
||||
import { Rank } from "../rankService";
|
||||
import { checkTaskInCreateHero } from "../task/taskService";
|
||||
import { ItemInter, RewardInter } from "../../pubUtils/interface";
|
||||
import { transPiece } from "./util";
|
||||
import { getInitHeroById } from "../roleService";
|
||||
import { addItems, combineFigureInfo, unlockFigureWithoutSave } from "./rewardService";
|
||||
|
||||
export class UpdateHeroes {
|
||||
roleId: string;
|
||||
roleName: string;
|
||||
serverId: number;
|
||||
incHeroNum: number = 0;
|
||||
incRoleCe: number = 0;
|
||||
pushHeroes: {hid: number, incHeroCe: number, ce: number, hero: HeroUpdate}[] = [];
|
||||
roleUpdate: RoleUpdate;
|
||||
role: RoleType;
|
||||
guild: GuildType;
|
||||
|
||||
constructor(roleId: string, roleName: string, serverId: number) {
|
||||
this.roleId = roleId;
|
||||
this.roleName = roleName;
|
||||
this.serverId = serverId;
|
||||
}
|
||||
|
||||
public setRole(role: RoleType) {
|
||||
this.role = role;
|
||||
}
|
||||
|
||||
public async getRole() {
|
||||
if(!this.role) {
|
||||
this.role = await RoleModel.findByRoleId(this.roleId);
|
||||
}
|
||||
return this.role;
|
||||
}
|
||||
|
||||
public addRoleUpdateParam(param: RoleUpdate) {
|
||||
this.roleUpdate = {...this.roleUpdate, ...param};
|
||||
}
|
||||
|
||||
public async updateDbCe(isCreate: boolean, heroInfo: HeroUpdate, originCe = 0) {
|
||||
let role = await this.getRole();
|
||||
if(isCreate) this.incHeroNum ++;
|
||||
if(heroInfo != originCe) this.incRoleCe += heroInfo.ce - originCe;
|
||||
this.addRoleUpdateParam(await calculatetopLineup(role, heroInfo.hid, heroInfo.ce, heroInfo._id ));
|
||||
this.pushHeroes.push({ hid: heroInfo.hid, incHeroCe: heroInfo.ce - originCe, ce: heroInfo.ce, hero: heroInfo });
|
||||
}
|
||||
|
||||
// 更新战力相关的各个表
|
||||
public async saveCeToDb() {
|
||||
let role = await this.getRole();
|
||||
// 更新role表
|
||||
this.role = await RoleModel.updateRoleInfo(this.roleId, {
|
||||
heroNum: this.incHeroNum + role.heroNum, ce: this.incRoleCe + role.ce, heroNumUpdatedAt: nowSeconds(), ...this.roleUpdate
|
||||
});
|
||||
|
||||
// 更新guild表
|
||||
if(role.hasGuild) {
|
||||
this.guild = await GuildModel.updateCe(this.roleId, this.incRoleCe, true); // 公会更新战力
|
||||
}
|
||||
for(let { hid, incHeroCe } of this.pushHeroes) {
|
||||
await PvpDefenseModel.updateCe(this.roleId, hid, incHeroCe); // 更新pvp防守阵战力
|
||||
}
|
||||
saveCeChangeLog(this.role, this.incRoleCe, this.role.ce, HERO_SYSTEM_TYPE.INIT, this.pushHeroes.map(cur => cur.hid));
|
||||
}
|
||||
|
||||
public async updateRedisRank() {
|
||||
let role = await this.getRole();
|
||||
let { serverId, roleId, pushHeroes } = this;
|
||||
// 更新军团信息
|
||||
if(this.guild) {
|
||||
let r = new Rank(REDIS_KEY.GUILD_INFO, { guildCode: this.guild.code });
|
||||
await r.generParamAndSet(REDIS_KEY.GUILD_INFO, { guildCode: this.guild.code }, { guild: this.guild });
|
||||
}
|
||||
// 武将数量
|
||||
if(this.incHeroNum > 0) {
|
||||
let r = new Rank(REDIS_KEY.HERO_NUM_RANK, { serverId });
|
||||
await r.setRankWithRoleInfo(roleId, role.heroNum, role.heroNumUpdatedAt, role);
|
||||
}
|
||||
|
||||
// 最强阵容
|
||||
let r = new Rank(REDIS_KEY.TOP_LINEUP_RANK, { serverId });
|
||||
await r.setRankWithRoleInfo(roleId, reduceCe(role.topLineupCe), 0, role);
|
||||
|
||||
// 最强武将
|
||||
for(let { hid, ce, hero } of pushHeroes) {
|
||||
let r2 = new Rank(REDIS_KEY.TOP_HERO_RANK, { serverId });
|
||||
await r2.setRankWithHeroInfo(roleId, hid, reduceCe(ce), 0, hero);
|
||||
|
||||
let r4 = new Rank(REDIS_KEY.HERO_RANK, { serverId, hid });
|
||||
await r4.setRankWithHeroInfo(roleId, hid, reduceCe(ce), 0, hero);
|
||||
}
|
||||
// 总战力
|
||||
let r3 = new Rank(REDIS_KEY.SUM_CE_RANK, { serverId });
|
||||
await r3.setRankWithRoleInfo(roleId, reduceCe(role.ce), 0, role);
|
||||
|
||||
// 更新最强五人阵容信息
|
||||
let r5 = new Rank(REDIS_KEY.TOP_LINEUP_INFO, { serverId });
|
||||
await r5.generParamAndSet(REDIS_KEY.TOP_LINEUP_INFO, { roleId }, { role });
|
||||
}
|
||||
|
||||
public async pushMessage(pinus: any, sid: string) {
|
||||
let role = await this.getRole();
|
||||
let uids = [{ uid: this.roleId, sid }];
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(role.ce) , heros: this.pushHeroes.map(cur => { return {...cur, ce: reduceCe(cur.ce), incHeroCe: reduceCe(cur.incHeroCe) }}), topLineupCe: reduceCe(role.topLineupCe) }), uids);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export class CreateHeroes extends UpdateHeroes {
|
||||
private resultHeroes: HeroType[] = [];
|
||||
private heroNum = 0;
|
||||
// 推送信息
|
||||
private figureInfos: { heads: Figure[], frames: Figure[], spines: Figure[] }[] = [];
|
||||
private skinPushMessages: { heros: {skins: HeroSkin[], hid: number}[], skins: {id: number, hid: number, inc: number, reason: number }[]} = { heros: [], skins: [] };
|
||||
|
||||
private async getSkinsOfThisHero(hid: number, initSkinInfo: SkinUpdate, isInit: boolean) {
|
||||
let allSkins = isInit? []: await SkinModel.findbyRoleAndHid(this.roleId, hid);
|
||||
let skin = await SkinModel.insertSkins(this.roleId, this.roleName, [initSkinInfo]);
|
||||
let skinInfos = skin.map(cur => ({ id: cur.id, hid, inc: 1, reason: ITEM_CHANGE_REASON.GET_HERO_UNLOCK_SKIN}))
|
||||
this.skinPushMessages.skins.push(...skinInfos);
|
||||
if(skin) allSkins.push(...skin);
|
||||
let skins: HeroSkin[] = [];
|
||||
for(let skin of allSkins) {
|
||||
skins.push(new HeroSkin(skin.id, skin.skinId, skin._id, skin.id == initSkinInfo.id));
|
||||
}
|
||||
return skins
|
||||
}
|
||||
|
||||
// game-server里面创建武将
|
||||
public async createWithHeroInfo(infos: Map<number, { heroInfo: HeroUpdate, skinInfo: SkinUpdate }>) {
|
||||
let role = await this.getRole();
|
||||
// 数据处理
|
||||
let conditions = new Array<{ type: number, paramHid?: number, paramFavourLv?: number, paramSkinId?: number }>(); // 解锁头像条件
|
||||
let initHeroInfos: HeroUpdate[] = [];
|
||||
for (let [ hid, { heroInfo, skinInfo }] of infos) {
|
||||
conditions.push({ type: FIGURE_UNLOCK_CONDITION.GET_HERO, paramHid: heroInfo.hid });
|
||||
this.updateDbCe(true, heroInfo);
|
||||
// 皮肤使用初始加载进内存的数据
|
||||
let skins = await this.getSkinsOfThisHero(hid, { ...skinInfo, _id: new SkinModel()._id }, false);
|
||||
let newAttr = new AttributeCal();
|
||||
newAttr.setLv(heroInfo.lv);
|
||||
newAttr.setByDbData(role.attr, heroInfo.attr);
|
||||
let heroCe = newAttr.calCe(); // 计算最终战力
|
||||
initHeroInfos.push({ ...heroInfo, skins, _id: new HeroModel()._id, ce: heroCe });
|
||||
this.heroNum ++;
|
||||
}
|
||||
// 武将使用初始加载数据插入
|
||||
this.resultHeroes = await HeroModel.insertHeroes(this.roleId, this.roleName, this.serverId, initHeroInfos);
|
||||
let heroSkins = this.resultHeroes.map(cur => { return pick(cur, ['hid', 'skins']) });
|
||||
|
||||
this.skinPushMessages.heros.push(...heroSkins);
|
||||
// 头像解锁
|
||||
let { figureInfo, frames, heads, spines } = unlockFigureWithoutSave(conditions, role);
|
||||
this.figureInfos.push(figureInfo);
|
||||
this.addRoleUpdateParam({ frames, heads, spines });
|
||||
// 更新战力
|
||||
await this.saveCeToDb();
|
||||
}
|
||||
|
||||
// 创建初始账号时候的初始
|
||||
public async createWithInitInfo(infos: Map<number, { heroInfo: HeroUpdate, skinInfo: SkinUpdate }>, figureInfo: { heads: Figure[], frames: Figure[], spines: Figure[] }) {
|
||||
this.figureInfos.push(figureInfo);
|
||||
let heroeInfos: HeroUpdate[] = [];
|
||||
for (let [ hid, { heroInfo, skinInfo }] of infos) {
|
||||
this.updateDbCe(true, heroInfo);
|
||||
let model = new SkinModel();
|
||||
let skins = await this.getSkinsOfThisHero(hid, { ...skinInfo, _id: model._id }, true);
|
||||
heroeInfos.push({ ...heroInfo, skins, _id: new HeroModel()._id});
|
||||
this.heroNum ++;
|
||||
}
|
||||
this.resultHeroes = await HeroModel.insertHeroes(this.roleId, this.roleName, this.serverId, heroeInfos);
|
||||
}
|
||||
|
||||
public async pushMessage(sid: string) {
|
||||
let role = await this.getRole();
|
||||
let uids = [{ uid: this.roleId, sid }];
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(role.ce) , heros: this.pushHeroes.map(cur => { return {...cur, ce: reduceCe(cur.ce), incHeroCe: reduceCe(cur.incHeroCe) }}), topLineupCe: reduceCe(role.topLineupCe) }), uids);
|
||||
let figureInfo = combineFigureInfo(this.figureInfos);
|
||||
if (!!figureInfo && (figureInfo.heads.length > 0 || figureInfo.frames.length > 0 || figureInfo.spines.length > 0)) {
|
||||
pinus.app.get('channelService').pushMessageByUids('onHeadChange', resResult(STATUS.SUCCESS, { ...figureInfo }), uids);
|
||||
}
|
||||
pinus.app.get('channelService').pushMessageByUids('onHeroSkinChange', resResult(STATUS.SUCCESS, this.skinPushMessages), uids);
|
||||
pinus.app.get('channelService').pushMessageByUids('onHeroUpdate', resResult(STATUS.SUCCESS, { heroes: this.getResultHeroes() }), uids);
|
||||
checkTaskInCreateHero(this.serverId, this.roleId, sid, this.heroNum, this.resultHeroes)
|
||||
}
|
||||
|
||||
public getResultHeroes() {
|
||||
return this.resultHeroes;
|
||||
}
|
||||
|
||||
public getShowHeroes() {
|
||||
return this.resultHeroes.map(cur => {
|
||||
let hero = new HeroShowParam(cur);
|
||||
return { ...hero, ce: reduceCe(cur.ce)}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
import { addItems, unlockFigure, } from "./rewardService";
|
||||
import { CounterModel } from "../../db/Counter";
|
||||
import { calculateCes } from "../playerCeService";
|
||||
import { RoleUpdate } from "../../db/Role";
|
||||
|
||||
/**
|
||||
* 创建多个武将
|
||||
@@ -221,29 +20,18 @@ export class CreateHeroes extends UpdateHeroes {
|
||||
* @param serverId
|
||||
* @param heroInfo
|
||||
*/
|
||||
export async function createHeroes(roleId: string, roleName: string, sid: string, serverId: number, heroInfo: CreateHeroParam[]) {
|
||||
export async function createHeroes(roleId: string, roleName: string, sid: string, serverId: number, heroInfo: CreateHeroParam[], initRoleInfos?: RoleUpdate) {
|
||||
let hids = heroInfo.map(cur => cur.hid);
|
||||
let userHeroesMap = await HeroModel.findMapByHidRange(hids, roleId);
|
||||
|
||||
let infos: Map<number, { heroInfo: HeroUpdate, skinInfo: SkinUpdate }> = new Map(), pieces: ItemInter[] = [];
|
||||
let createHids: number[] = [], pieces: ItemInter[] = [];
|
||||
for (let h of heroInfo) {
|
||||
let heroCount = h.count || 1;
|
||||
if (userHeroesMap.has(h.hid)) {
|
||||
let { pieceId, count } = transPiece(h.hid);
|
||||
pieces.push({ id: pieceId, count: count * heroCount });
|
||||
} else {
|
||||
let initInfo: { heroInfo: HeroUpdate, skinInfo: SkinUpdate };
|
||||
if(pinus.app.getServerType() == 'role') {
|
||||
initInfo = getInitHeroById(h.hid);
|
||||
} else {
|
||||
let roleServers = pinus.app.getServersByType('role');
|
||||
let server = getRandSingleEelm(roleServers);
|
||||
initInfo = await pinus.app.rpc.role.roleRemote.getInitHeroById.toServer(server.id, h.hid);
|
||||
}
|
||||
|
||||
initInfo.heroInfo = { ...initInfo.heroInfo, ...h };
|
||||
|
||||
infos.set(h.hid, initInfo);
|
||||
createHids.push(h.hid);
|
||||
userHeroesMap.set(h.hid, null);
|
||||
if (heroCount > 1) {
|
||||
let { pieceId, count } = transPiece(h.hid);
|
||||
@@ -252,24 +40,60 @@ export class CreateHeroes extends UpdateHeroes {
|
||||
}
|
||||
}
|
||||
|
||||
let resultHeroes: HeroType[] = [], resultItems: RewardInter[] = [], heroes: HeroShowParam[] = [];
|
||||
if (infos.size > 0) {
|
||||
let createHero = new CreateHeroes(roleId, roleName, serverId);
|
||||
await createHero.createWithHeroInfo(infos);
|
||||
await createHero.pushMessage(sid);
|
||||
await createHero.updateRedisRank();
|
||||
heroes = createHero.getShowHeroes();
|
||||
resultHeroes = createHero.getResultHeroes();
|
||||
let resultHeroes: HeroType[] = [], resultItems: RewardInter[] = [], showHeroes: HeroShowParam[] = [];
|
||||
let figureConditions: { type: FIGURE_UNLOCK_CONDITION, paramHid: number }[] = [];
|
||||
let incHeroNum = 0;
|
||||
let skins: SkinUpdate[] = [];
|
||||
if (createHids.length > 0) {
|
||||
let heroInfos = new Map<number, HeroUpdate>();
|
||||
for(let hid of createHids) {
|
||||
let initSkin = SkinModel.getInitInfo(hid);
|
||||
skins.push(initSkin); // 初始皮肤
|
||||
let seqId = await CounterModel.getNewCounter(COUNTER.HID) || -1;
|
||||
let initHero = HeroModel.getInitInfo(hid, { seqId, roleId, roleName, skins: [new HeroSkin(initSkin)] });
|
||||
heroInfos.set(hid, initHero);
|
||||
figureConditions.push({ type: FIGURE_UNLOCK_CONDITION.GET_HERO, paramHid: hid });
|
||||
incHeroNum ++;
|
||||
}
|
||||
await unlockFigure(sid, roleId, figureConditions);
|
||||
|
||||
let roleUpdata: RoleUpdate = { heroNumUpdatedAt: nowSeconds() };
|
||||
if(initRoleInfos) {
|
||||
roleUpdata = { ...initRoleInfos, ...roleUpdata }
|
||||
}
|
||||
let { heroes } = await calculateCes(HERO_SYSTEM_TYPE.INIT, roleId, serverId, sid, heroInfos, roleUpdata, { heroNum: incHeroNum }, { isInitRole: !!initRoleInfos });
|
||||
for(let hero of heroes) {
|
||||
showHeroes.push(new HeroShowParam(hero));
|
||||
resultHeroes.push(hero);
|
||||
}
|
||||
|
||||
let uids = [{ uid: roleId, sid }];
|
||||
await SkinModel.insertSkins(roleId, roleName, skins);
|
||||
pinus.app.get('channelService').pushMessageByUids('onHeroSkinChange', resResult(STATUS.SUCCESS, getSkinPushMsg(resultHeroes, skins)), uids);
|
||||
pinus.app.get('channelService').pushMessageByUids('onHeroUpdate', resResult(STATUS.SUCCESS, { heroes }), uids);
|
||||
|
||||
}
|
||||
|
||||
if (pieces.length > 0) {
|
||||
let goods = await addItems(roleId, roleName, sid, pieces, ITEM_CHANGE_REASON.HERO_TRANSFER_PIECE);
|
||||
resultItems = goods;
|
||||
}
|
||||
return { heroes, resultHeroes, goods: resultItems }
|
||||
return { heroes: showHeroes, resultHeroes, goods: resultItems }
|
||||
}
|
||||
|
||||
export async function createHero(roleId: string, roleName: string, sid: string, serverId: number, heroInfo: CreateHeroParam) {
|
||||
let result = await createHeroes(roleId, roleName, sid, serverId, [heroInfo]);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
function getSkinPushMsg(resultHeroes: HeroType[], skins: SkinUpdate[]) {
|
||||
let skinPushMessages: {heros: {skins: HeroSkin[], hid: number}[], skins: {id: number, hid: number, inc: number, reason: number }[]} = { heros: [], skins:[] }; // 皮肤推送信息
|
||||
for(let { hid, skins } of resultHeroes) {
|
||||
skinPushMessages.heros.push({ hid, skins });
|
||||
}
|
||||
for(let { id, hid } of skins) {
|
||||
skinPushMessages.skins.push({ id, hid, inc: 1, reason: ITEM_CHANGE_REASON.GET_HERO_UNLOCK_SKIN })
|
||||
}
|
||||
return skinPushMessages;
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
import { DEFAULT_HEROES, DEFAULT_HERO_LV, FIGURE_UNLOCK_CONDITION, HERO_SYSTEM_TYPE, LINEUP_NUM } from "../../consts";
|
||||
import { HeroModel, HeroSkin, HeroUpdate } from "../../db/Hero";
|
||||
import { RoleModel, RoleUpdate } from "../../db/Role";
|
||||
import { SkinModel, SkinUpdate } from "../../db/Skin";
|
||||
import { TopHero } from "../../domain/dbGeneral";
|
||||
import { CalHeroCe, CalRoleCe } from "../../domain/roleField/calCe";
|
||||
import { gameData, getHeroExpByLv } from "../../pubUtils/data";
|
||||
import { unlockFigureWithoutSave } from "./rewardService";
|
||||
|
||||
// 储存在内存中的初始数据
|
||||
export function getInitRoleInfo() {
|
||||
let topLineup: TopHero[] = [], topLineupCe = 0, allCe = 0,
|
||||
heroes: HeroUpdate[] = [], initHeroes: HeroUpdate[] = [], initSkins: SkinUpdate[] = [], heroNum = 0,
|
||||
conditions: {type: FIGURE_UNLOCK_CONDITION, paramHid: number }[] = [];
|
||||
let role = new RoleModel();
|
||||
let calRoleCe = new CalRoleCe(role);
|
||||
let roleAttr = calRoleCe.cal(HERO_SYSTEM_TYPE.INIT);
|
||||
|
||||
for(let { actorId: hid } of gameData.recruit) {
|
||||
let { quality, initialStars: star, jobid: job, name: hName, initialSkin } = gameData.hero.get(hid);
|
||||
// 皮肤
|
||||
let skin = new SkinModel();
|
||||
let dicFashion = gameData.fashion.get(initialSkin);
|
||||
if(!dicFashion) {
|
||||
console.log(`not found skin: ${initialSkin} of ${hid}`);
|
||||
continue;
|
||||
}
|
||||
let skinInfo = { ...skin.toJSON(), id: initialSkin, hid, skinName: dicFashion.name, skinId: dicFashion.heroId };
|
||||
initSkins.push(skinInfo);
|
||||
// 武将
|
||||
let hero = new HeroModel();
|
||||
let heroInfo = {...hero.toJSON(), hid, star, quality, hName, job, skins: [new HeroSkin(initialSkin, skinInfo.skinId, skinInfo._id, true)], skinId: skinInfo.skinId, lv: DEFAULT_HERO_LV, exp: getHeroExpByLv(DEFAULT_HERO_LV - 1) || 0 };
|
||||
let calHeroCe = new CalHeroCe(hid, heroInfo);
|
||||
let heroAttr = calHeroCe.cal(HERO_SYSTEM_TYPE.INIT);
|
||||
let ce = calHeroCe.getCalculatedCe(roleAttr);
|
||||
heroes.push({ ...heroInfo, attr: heroAttr, ce, historyCe: ce });
|
||||
// 更新role表
|
||||
if(DEFAULT_HEROES.includes(hid)) {
|
||||
// 头像
|
||||
conditions.push({ type: FIGURE_UNLOCK_CONDITION.GET_HERO, paramHid: hid });
|
||||
allCe += ce;
|
||||
heroNum++;
|
||||
initHeroes.push({ ...heroInfo, attr: heroAttr, ce, historyCe: ce });
|
||||
}
|
||||
}
|
||||
let { figureInfo, heads, frames, spines } = unlockFigureWithoutSave(conditions, role);
|
||||
// 最强阵容
|
||||
initHeroes.sort((a, b) => { return b.ce - a.ce });
|
||||
for(let i = 0; i < LINEUP_NUM; i++) {
|
||||
if(initHeroes[i]) {
|
||||
let { hid, ce, _id } = initHeroes[i];
|
||||
topLineup.push({ hid, ce, hero: _id });
|
||||
topLineupCe += ce;
|
||||
}
|
||||
}
|
||||
|
||||
let initRole: RoleUpdate = { topLineupCe, topLineup, attr: roleAttr, ce: allCe, heroNum, heroNumUpdatedAt: Date.now(), heads, frames, spines };
|
||||
return {
|
||||
role: initRole, heroes, skins: initSkins, figureInfo
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,6 @@ import { ITID, CONSUME_TYPE, ITEM_TABLE, CURRENCY, CURRENCY_TYPE, MAIL_TYPE, HAN
|
||||
import { getDecimalCnt, getRandEelm, getRandEelmWithWeight, getRandSingleEelm, getRandValueByMinMax, resResult } from '../../pubUtils/util';
|
||||
import { RoleModel, RoleType } from '../../db/Role';
|
||||
import { setAp } from '../actionPointService';
|
||||
import { pushCalAllHeroCe, calPlayerCeAndSave, calAllHeroCe } from '../playerCeService';
|
||||
import { ItemModel, ItemType } from '../../db/Item';
|
||||
import { STATUS } from '../../consts/statusCode';
|
||||
import { pinus } from 'pinus';
|
||||
@@ -23,10 +22,9 @@ import { reportTAEvent, reportTAUserSet } from '../sdkService';
|
||||
import { saveCoinChangeLog, saveFigureInfoLog, saveGoldChangeLog, saveItemChangeLog } from '../../pubUtils/logUtil';
|
||||
import { JewelModel, JewelType, jewelUpdate, RandSe } from '../../db/Jewel';
|
||||
import { updateEplaces } from '../equipService';
|
||||
import { checkPopUpConditionInCreateHero } from '../activity/popUpShopService';
|
||||
import { CreateHeroes } from './createHero';
|
||||
import { combineItems, getCoinEventProperties, getGoldEventProperties, sortItems } from './util';
|
||||
import { nowSeconds } from '../../pubUtils/timeUtil';
|
||||
import { calculateCeWithHero, calculateCeWithRole } from '../playerCeService';
|
||||
|
||||
|
||||
|
||||
@@ -71,7 +69,7 @@ export async function handleCost(roleId: string, sid: string, goods: Array<ItemI
|
||||
heroMap.get(jewel.hid).jewels.push(jewel);
|
||||
}
|
||||
}
|
||||
for(let [_hid, {hero, jewels} ] of heroMap) {
|
||||
for(let [hid, {hero, jewels} ] of heroMap) {
|
||||
// 脱下天晶石
|
||||
let update = new Map<number, Partial<EPlace>>();
|
||||
for(let jewel of jewels) {
|
||||
@@ -82,7 +80,7 @@ export async function handleCost(roleId: string, sid: string, goods: Array<ItemI
|
||||
}
|
||||
}
|
||||
let { newEplace } = updateEplaces(hero.ePlace, update);
|
||||
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, { ePlace: newEplace }, [...update.keys()]);
|
||||
await calculateCeWithHero(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, roleId, role.serverId, sid, hid, { ePlace: newEplace }, { ePlaceIds: [...update.keys()] });
|
||||
}
|
||||
|
||||
|
||||
@@ -216,8 +214,6 @@ export async function addItems(roleId: string, roleName: string, sid: string, go
|
||||
pushHeroSkinMsg(heroskins, skinInfos, uids); // 推送onHeroSkinChange
|
||||
saveItemChangeLog(roleId, skinInfos, reason);
|
||||
}
|
||||
// 推送全局加成信息
|
||||
if(calAllHeroResult) await pushCalAllHeroCe(roleId, sid, calAllHeroResult);
|
||||
}
|
||||
|
||||
// 5. 获得头像和相框等
|
||||
@@ -362,12 +358,12 @@ export async function addSkin(roleId: string, roleName: string, sid: string, ski
|
||||
if(skin.hid && !hero) hero = await HeroModel.findByHidAndRole(skin.hid, roleId);
|
||||
let condition = { type: FIGURE_UNLOCK_CONDITION.GET_SKIN, paramSkinId: skinId };
|
||||
await unlockFigure(sid, roleId, [condition]); // 解锁头像
|
||||
await calAllHeroCe(HERO_SYSTEM_TYPE.ADD_SKIN, sid, roleId, {}, [skinId]); // 全局加成
|
||||
await calculateCeWithRole(HERO_SYSTEM_TYPE.ADD_SKIN, roleId, hero.serverId, sid, {}, { skinId }); // 全局加成
|
||||
|
||||
if (hero) { // 有武将的,将皮肤链接到武将上
|
||||
let curSkin = hero.skins.find(cur => cur.id == skinId);
|
||||
if (!curSkin) {
|
||||
hero.skins.push(new HeroSkin(skin.id, skin.skinId, skin._id, enable ));
|
||||
hero.skins.push(new HeroSkin(skin, enable));
|
||||
await HeroModel.updateHeroInfo(roleId, hero.hid, hero);
|
||||
}
|
||||
return hero;
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import { ChannelUser } from './../domain/ChannelUser';
|
||||
import { Channel, pinus } from 'pinus';
|
||||
import { getRandValueByMinMax, getRandEelm, decodeIdCntArrayStr } from '../pubUtils/util';
|
||||
import { DEFAULT_HEROES, ROLE_SELECT, TALENT_RELATION_TYPE, TERAPH_RANDOM } from "../consts";
|
||||
import { DEFAULT_HEROES, LINEUP_NUM, ROLE_SELECT, TALENT_RELATION_TYPE, TERAPH_RANDOM } from "../consts";
|
||||
import { DicTeraph } from '../pubUtils/dictionary/DicTeraph';
|
||||
import { Teraph, RoleModel, RoleType, RoleUpdate } from '../db/Role';
|
||||
import { SCHOOL } from '../pubUtils/dicParam';
|
||||
import { gameData, getHeroInitTalent } from '../pubUtils/data';
|
||||
import { SchoolModel } from '../db/School';
|
||||
import { SclResultInter, SclPosInter, RewardInter, ItemInter } from '../pubUtils/interface';
|
||||
import { HeroSkin, HeroUpdate, Talent } from '../db/Hero';
|
||||
import { HeroModel, HeroSkin, HeroUpdate, Talent } from '../db/Hero';
|
||||
import { SkinUpdate } from '../db/Skin';
|
||||
import { Figure } from '../domain/dbGeneral';
|
||||
import { pick } from 'underscore';
|
||||
@@ -251,4 +251,4 @@ export function initSkinTalent(skins: HeroSkin[], isAll = false) {
|
||||
}
|
||||
}
|
||||
return newSkins
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,8 +22,7 @@ import { getZeroPoint } from "../../pubUtils/timeUtil";
|
||||
import { resResult } from "../../pubUtils/util";
|
||||
import { getActivities, getActivitiesByType, getActivityByServerId } from "../activity/activityService";
|
||||
import { getRoleCreateTime, getRoleOnlineInfo, getServerCreateTime } from "../redisService";
|
||||
import { getEquipById, getJewelByEquip } from "../equipService";
|
||||
import { isRandSeUnLock } from "../../pubUtils/playerCe";
|
||||
import { getEquipById, getJewelByEquip, isRandSeUnLock } from "../equipService";
|
||||
|
||||
export class CheckTask {
|
||||
serverId: number; // 区id
|
||||
|
||||
Reference in New Issue
Block a user