diff --git a/game-server/app/services/eventSercive.ts b/game-server/app/services/eventSercive.ts index 7650f71bf..ff206ef74 100644 --- a/game-server/app/services/eventSercive.ts +++ b/game-server/app/services/eventSercive.ts @@ -307,7 +307,7 @@ function pushEventMsg(sid: string, roleId: string, msg: any ) { * @param status 状态id */ export function checkEventStatus(type: number, status: number) { - + console.log('type = '+ type + ' status = '+status); let flag: boolean; // 检查状态是否正确 if(type == EVENT_TYPE.BATTLE||type ==EVENT_TYPE.QUIZ) { if(status == EVENT_RECORD_STATUS.BATTLE_SUCCESS) { diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 165eb2513..607bb04cf 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -135,7 +135,6 @@ export const STATUS = { // 武将训练,好感度,羁绊,时装相关 30300 - 30399 HERO_NOT_FIND: {code: 30300, simStr: '武将不存在' }, - HERO_JOB_REACH_MAX_STAGE: {code: 30300, simStr: '武将已达到最大的职业阶级'}, HERO_JOB_STAGE_REACH_MAX_STAGE: {code: 30301, simStr: '武将已训练到最大阶段'}, NOT_REACH_UNLOCK_LEVEL: {code: 30302, simStr: '未达到解锁等级'}, HERO_SKIN_NOT_FIND: {code: 30303, simStr: '时装不存在'}, @@ -144,7 +143,8 @@ export const STATUS = { HERO_CONECTION_IS_MAX_LEVEL: {code: 30306, simStr: '羁绊已达到最大等级'}, HERO_CONECTION_IS_NOT_EXIT: {code: 30307, simStr: '羁绊不存在'}, ROLE_SHORT_HERO_CONECTION:{code: 30308, simStr: '未拥有羁绊武将'}, - HERO_FAVOUR_LEVEL_REACH_MAXT:{code: 30308, simStr: '武将好感等级以达到最大'}, + HERO_FAVOUR_LEVEL_REACH_MAXT:{code: 30309, simStr: '武将好感等级以达到最大'}, + HERO_JOB_REACH_MAX_STAGE: {code: 30310, simStr: '武将已达到最大的职业阶级'}, // 装备养成 30400-30499 ROLE_EQUIP_PLACE_NOT_ENOUGH: {code: 30400, simStr: '装备栏未装备或无可强化'}, @@ -163,21 +163,21 @@ export const STATUS = { EQUIP_IS_EQUIPED_NOT_DECOMPOSE: {code: 30503, simStr: '装备已穿戴,不能分解'}, EQUIP_HOLE_NOT_FIND: {code: 30504, simStr: '装备孔不存在' }, EQUIP_HOLE_IS_DUG: {code: 30505, simStr: '装备已经打过孔' }, - EQUIP_HOLE_IS_NOT_DUG: {code: 30505, simStr: '装备未打过孔' }, - JEWEL_IS_NOT_FIND: {code: 30506, simStr: '宝石不存在' }, - EQUIP_NOT_FILL_HOLE: {code: 30506, simStr: '未穿戴宝石' }, - EQUIP_NOT_EQUIPED_HERO: {code: 30507, simStr: '装备不能被该武将穿戴'}, - EQUIP_LEVEL_LIMIT: {code: 30508, simStr: '装备穿戴等级限制'}, - EQUIP_NOT_MATCH_JEWEL: {code: 30504, simStr: '装备不能镶嵌该宝石' }, - //全局养成30500-30699 - ROLE_REACH_MAX_TITLE_LEVEL: {code: 30500, simStr: '玩家已达到最高的爵位'}, - ROLE_TERAPH_NOT_STRENGTHEN: {code: 30501, simStr: '玩家神像不能强化'}, - ROLE_TERAPH_NOT_QUILITY: {code: 30502, simStr: '玩家神像不能进阶'}, + EQUIP_HOLE_IS_NOT_DUG: {code: 30506, simStr: '装备未打过孔' }, + JEWEL_IS_NOT_FIND: {code: 30507, simStr: '宝石不存在' }, + EQUIP_NOT_FILL_HOLE: {code: 30508, simStr: '未穿戴宝石' }, + EQUIP_NOT_EQUIPED_HERO: {code: 30509, simStr: '装备不能被该武将穿戴'}, + EQUIP_LEVEL_LIMIT: {code: 30510, simStr: '装备穿戴等级限制'}, + EQUIP_NOT_MATCH_JEWEL: {code: 30511, simStr: '装备不能镶嵌该宝石' }, + //全局养成30600-30799 + ROLE_REACH_MAX_TITLE_LEVEL: {code: 30600, simStr: '玩家已达到最高的爵位'}, + ROLE_TERAPH_NOT_STRENGTHEN: {code: 30601, simStr: '玩家神像不能强化'}, + ROLE_TERAPH_NOT_QUILITY: {code: 30602, simStr: '玩家神像不能进阶'}, - ROLE_SCHOOL_HERO_USED: {code: 30600, simStr: '该武将已配置'}, - ROLE_SCHOOL_POSITION_LOCKED: {code: 30601, simStr: '该位置未解锁'}, - ROLE_SCHOOL_POSITION_UNLOCK_NOT_NEED: {code: 30602, simStr: '该位置已解锁'}, - ROLE_SCROLL_REACH_MAX: {code: 30603, simStr: '已经升到可以升的最高等级'}, + ROLE_SCHOOL_HERO_USED: {code: 30603, simStr: '该武将已配置'}, + ROLE_SCHOOL_POSITION_LOCKED: {code: 30604, simStr: '该位置未解锁'}, + ROLE_SCHOOL_POSITION_UNLOCK_NOT_NEED: {code: 30605, simStr: '该位置已解锁'}, + ROLE_SCROLL_REACH_MAX: {code: 30606, simStr: '已经升到可以升的最高等级'}, // 社交相关状态 40000 - 49999 // 运营模块相关状态 50000 - 59999 diff --git a/shared/db/GMUser.ts b/shared/db/GMUser.ts index c5ab0721a..29f30d451 100644 --- a/shared/db/GMUser.ts +++ b/shared/db/GMUser.ts @@ -12,79 +12,79 @@ const SALT_WORK_FACTOR = 5 @index({ uid: 1 }) export default class GMUser extends BaseModel { - @prop({ required: true }) - uid: number; + @prop({ required: true }) + uid: number; - @prop({ required: true }) - name: string; + @prop({ required: true }) + name: string; - @prop({ required: true }) - username: string; + @prop({ required: true }) + username: string; - @prop({ required: true }) - password: string; + @prop({ required: true }) + password: string; - @prop({ required: true }) - salt: string; + @prop({ required: true }) + salt: string; - @prop({ required: true }) - token: string; + @prop({ required: true }) + token: string; - private static async encryptPass(password: string, salt?: string) { - if(!salt) { - salt = await bcrypt.genSalt(SALT_WORK_FACTOR); + private static async encryptPass(password: string, salt?: string) { + if (!salt) { + salt = await bcrypt.genSalt(SALT_WORK_FACTOR); + } + let npassword = await bcrypt.hash(password, salt); + return { npassword, salt }; } - let npassword = await bcrypt.hash(password, salt); - return {npassword, salt}; - } - - public static async getGmAccountList(lean = true) { - const user: GMUserType[] = await GMUserModel.find().select('uid username name token').lean(lean); - return user; - } - public static async getGmAccountByToken(token: string, lean = true) { - // console.log(token) - const user: GMUserType = await GMUserModel.findOne({token}).select('uid username name token').lean(lean); - return user; - } - - public static async getGmAccountByUid(uid: number, lean = true) { - const user: GMUserType = await GMUserModel.findOne({uid}).select('uid username name token').lean(lean); - return user; - } - - public static async getGmAccountByUsername(username: string, lean = true) { - const user: GMUserType = await GMUserModel.findOne({username}).select('uid username name token').lean(lean); - return user; - } - - public static async login(username: string, password: string, token: string, lean = true) { - const user: GMUserType = await GMUserModel.findOne({username}).select('salt').lean(); - if(user) { - let { salt } = user; - let { npassword } = await this.encryptPass(password, salt); - const checkUser: GMUserType = await GMUserModel.findOneAndUpdate({username, password: npassword}, { token }).select('uid username name token').lean(lean); - return checkUser; - } else { - return null + public static async getGmAccountList(lean = true) { + const user: GMUserType[] = await GMUserModel.find().select('uid username name token').lean(lean); + return user; } - } - public static async createGmAccount(username: string, password: string, name: string, token: string, lean = true) { - const uid = await CounterModel.getNewCounter(COUNTER.GMUID); - let r = await this.encryptPass(password); - const user: GMUserType = await GMUserModel.findOneAndUpdate({username}, {uid, password: r.npassword, salt: r.salt, name, token}, {upsert: true, new: true}).select('uid username name').lean(lean); - return user; - } + public static async getGmAccountByToken(token: string, lean = true) { + // console.log(token) + const user: GMUserType = await GMUserModel.findOne({ token }).select('uid username name token').lean(lean); + return user; + } - public static async changePass(uid: number, password: string, lean = true) { - let r = await this.encryptPass(password); - const user: GMUserType = await GMUserModel.findOneAndUpdate({uid}, { password: r.npassword, salt: r.salt}).select('uid username name').lean(lean); - return user; - } + public static async getGmAccountByUid(uid: number, lean = true) { + const user: GMUserType = await GMUserModel.findOne({ uid }).select('uid username name token').lean(lean); + return user; + } + + public static async getGmAccountByUsername(username: string, lean = true) { + const user: GMUserType = await GMUserModel.findOne({ username }).select('uid username name token').lean(lean); + return user; + } + + public static async login(username: string, password: string, token: string, lean = true) { + const user: GMUserType = await GMUserModel.findOne({ username }).select('salt').lean(); + if (user) { + let { salt } = user; + let { npassword } = await this.encryptPass(password, salt); + const checkUser: GMUserType = await GMUserModel.findOneAndUpdate({ username, password: npassword }, { token }).select('uid username name token').lean(lean); + return checkUser; + } else { + return null + } + } + + public static async createGmAccount(username: string, password: string, name: string, token: string, lean = true) { + const uid = await CounterModel.getNewCounter(COUNTER.GMUID); + let r = await this.encryptPass(password); + const user: GMUserType = await GMUserModel.findOneAndUpdate({ username }, { uid, password: r.npassword, salt: r.salt, name, token }, { upsert: true, new: true }).select('uid username name').lean(lean); + return user; + } + + public static async changePass(uid: number, password: string, lean = true) { + let r = await this.encryptPass(password); + const user: GMUserType = await GMUserModel.findOneAndUpdate({ uid }, { password: r.npassword, salt: r.salt }).select('uid username name').lean(lean); + return user; + } } export const GMUserModel = getModelForClass(GMUser); -export interface GMUserType extends Pick, keyof GMUser>{}; +export interface GMUserType extends Pick, keyof GMUser> { }; diff --git a/shared/db/PvpDefense.ts b/shared/db/PvpDefense.ts index d571f15bf..1f867149f 100644 --- a/shared/db/PvpDefense.ts +++ b/shared/db/PvpDefense.ts @@ -7,7 +7,7 @@ class Heroes { @prop({ required: true }) actorName: string; // 武将名 @prop({ required: true }) - attribute: {hp: number, atk: number, matk: number, def: number, mdef: number, agi: number, luk: number, speed: number, hit: number, cri: number, flee: number, antCri: number, damageIncrease: number, damageDecrease: number, defIgnore: number, bloodSuck: number, ap: number}; // 属性 + attribute: { hp: number, atk: number, matk: number, def: number, mdef: number, agi: number, luk: number, speed: number, hit: number, cri: number, flee: number, antCri: number, damageIncrease: number, damageDecrease: number, defIgnore: number, bloodSuck: number, ap: number }; // 属性 @prop({ required: true }) lv: number; // 角色等级 @prop({ required: true }) @@ -18,8 +18,8 @@ class Heroes { seid: string; // 技能 @prop({ required: false }) star: number; // 角色星级 - } - +} + @index({ roleId: 1 }) @index({ ce: 1 }) @@ -84,4 +84,4 @@ export default class PvpDefense extends BaseModel { export const PvpDefenseModel = getModelForClass(PvpDefense); -export interface PvpDefenseType extends Pick, keyof PvpDefense>{}; \ No newline at end of file +export interface PvpDefenseType extends Pick, keyof PvpDefense> { }; \ No newline at end of file diff --git a/shared/pubUtils/playerCe.ts b/shared/pubUtils/playerCe.ts index b8b71a8b5..7aaf54d21 100644 --- a/shared/pubUtils/playerCe.ts +++ b/shared/pubUtils/playerCe.ts @@ -15,7 +15,7 @@ import { EquipType } from '../db/Equip'; import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool'; import { getGoodById } from './gamedata'; import { SchoolModel } from '../db/School'; -import { getTeraphAttr } from '../consts/constModules/abilityConst' +import { getTeraphAttr, HEROTARIN } from '../consts/constModules/abilityConst' import { PvpDefenseModel } from '../db/PvpDefense'; const HERO_CE_RATIO = 100; const _ = require('underscore'); @@ -106,7 +106,6 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array, let incHeroCe = calPlayerCe(role.globalCeAttr, hero, type, args); incPlayerCe += incHeroCe; - // hero.ce += incHeroCe; await calculateTopFive(role, hero.hid, hero.ce); // 计算更新最强五人战力 await HeroModel.updateHeroInfo(roleId, hero.hid, hero); await PvpDefenseModel.updateCe(roleId, hero.hid, hero.ce); // 更新pvp防守阵最强五人战力 @@ -159,37 +158,11 @@ async function calculateTopFive(role: RoleType, hid: number, ce: number) { // 初始战力 export function calHeroInitIncAttr(hero: HeroType, addSeidList: Array, removeSeidList: Array) { - let res1 = calHeroStarIncAttr(hero, HERO_SYSTEM_TYPE.INIT, hero.hid, [], addSeidList, removeSeidList); - let hero1 = combineHeroCeAttr(hero, res1); - + let res = calHeroStarIncAttr(hero, HERO_SYSTEM_TYPE.INIT, hero.hid, [], addSeidList, removeSeidList); let curSkin = hero.skins.find(cur => cur.enable); - let res2 = calHeroWearSkinIncAttr(hero1, [curSkin ? curSkin.id : 0, 0], addSeidList, removeSeidList, true); - let hero2 = combineHeroCeAttr(hero, res2); - - calHeroJobStageUpIncAttr(hero2, [0], addSeidList, removeSeidList); - - let result: CeAttr = {}; - combineAttrResult(result, res1); - combineAttrResult(result, res2); - - return res1 -} - -function combineAttrResult(target: CeAttr, origin: CeAttr) { - - for (let attrName in origin) { - for (let attrKey in origin[attrName]) { - if (!target.hasOwnProperty(attrName)) { - target[attrName] = {}; - } - if (!target[attrName].hasOwnProperty(attrKey)) { - target[attrName][attrKey] = 0; - } - if (origin[attrName][attrKey] > target[attrName][attrKey]) { - target[attrName][attrKey] = origin[attrName][attrKey]; - } - } - } + calHeroWearSkinIncAttr(hero, [curSkin ? curSkin.id : 0, 0], addSeidList, removeSeidList, true, res); + calHeroJobAttr(hero, res, addSeidList, removeSeidList); + return res; } export function calRoleInitIncAttr(heros: HeroType[], globalCeAttr: CeAttrRole) { @@ -203,21 +176,6 @@ export function calRoleInitIncAttr(heros: HeroType[], globalCeAttr: CeAttrRole) return res; } -// 将hero的ceAttr暂时更新,不更新在originalHero本体上 -function combineHeroCeAttr(originalHero: HeroType, result: CeAttr) { - let hero = deepCopy(originalHero); - if (!hero.ceAttr) hero.ceAttr = new CeAttr(); - for (let attrName in result) { - if (!result[attrName]) continue; - if (!hero.ceAttr[attrName]) hero.ceAttr[attrName] = new CeAttrData(); - for (let attrKey in result[attrName]) { - hero.ceAttr[attrName][attrKey] = parseInt(result[attrName][attrKey] || 0); - } - } - delete hero._id; - return hero; -} - /** * * @param hero HeroType 武将更新后的值 @@ -352,22 +310,44 @@ export function calHeroJobStageUpIncAttr(hero: HeroType, args: Array, ad return res; } + +export function calHeroJobAttr(hero: HeroType, res: CeAttr, addSeidList: Array, removeSeidList: Array) { + let currentJob = gameData.job.get(hero.job); + let jobGradeAndClass = getJobByGradeAndClass(currentJob.job_class, currentJob.grade - 1); + let lastJob; + if (!!jobGradeAndClass) { + lastJob = gameData.job.get(jobGradeAndClass.jobid); + } + for (let key in HEROTARIN) { + let attrName: string = HEROTARIN[key]; + res[attrName] = res[attrName]||{ fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp }; + if (hero.jobStage >= parseInt(key)) { + res[attrName].fixUp += currentJob[attrName] * HERO_CE_RATIO; + } else { + if (lastJob) + res[attrName].fixUp += lastJob[attrName] * HERO_CE_RATIO; + } + } + calHeroJobStageUpIncAttr(hero, [0], addSeidList, removeSeidList); + return res; +} + //穿戴时装 -export function calHeroWearSkinIncAttr(hero: HeroType, args: Array, addSeidList: Array, removeSeidList: Array, isInit = false) { - let res: CeAttr = {}; +export function calHeroWearSkinIncAttr(hero: HeroType, args: Array, addSeidList: Array, removeSeidList: Array, isInit = false, heroAttr?:CeAttr) { + let res: CeAttr = heroAttr||{}; let addSkin = gameData.fashion.get(args[0]); let delSkin = gameData.fashion.get(args[1]); let attrName: string; if (delSkin) { for (let attr of delSkin.actorAttr) { attrName = getAtrrNameById(attr.id); - res[attrName] = { fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp }; + res[attrName] = res[attrName]||{ fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp }; res[attrName].fixUp -= attr.number * HERO_CE_RATIO; } } for (let attr of addSkin.actorAttr) { attrName = getAtrrNameById(attr.id); - res[attrName] = { fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp }; + res[attrName] = res[attrName]||{ fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp }; res[attrName].fixUp += attr.number * HERO_CE_RATIO; } @@ -563,7 +543,7 @@ export function calHeroEquipIncAttr(hero: HeroType) { let originalCe = hero.ceAttr[attrName].equipUp || 0; console.log('装备战力:', attrName, attrResult[attrName] * HERO_CE_RATIO, originalCe); res[attrName] = { fixUp: hero.ceAttr[attrName].fixUp, base: hero.ceAttr[attrName].base, ratioUp: hero.ceAttr[attrName].ratioUp, equipUp: originalCe }; - res[attrName].equipUp += attrResult[attrName] * HERO_CE_RATIO - originalCe; + res[attrName].equipUp += attrResult[attrName] - originalCe; } return res;