diff --git a/game-server/app/servers/battle/handler/guildHandler.ts b/game-server/app/servers/battle/handler/guildHandler.ts index b80e6c2bd..d2d97f4f8 100644 --- a/game-server/app/servers/battle/handler/guildHandler.ts +++ b/game-server/app/servers/battle/handler/guildHandler.ts @@ -169,7 +169,9 @@ export class GuildHandler { let managerCntInc = 0; if(auth == GUILD_AUTH.LEADER) { // 转让团长 - managerCntInc = -1; + if(hisUserGuild.auth == GUILD_AUTH.MANAGER) { + managerCntInc = -1; + } } else { managerCntInc = auth == GUILD_AUTH.MANAGER? 1: -1; } @@ -815,12 +817,13 @@ export class GuildHandler { return resResult(STATUS.GUILD_ACTIVE_POINT_NOT_REACH); } - if(userGuild.receivedActive >= activeDayReward.activeDayPoint) { + if(userGuild.receivedActive.includes(id)) { return resResult(STATUS.GUILD_ACTIVE_BOX_HAS_RECEIVED); } + userGuild.receivedActive.push(id); let goods = await addItems(roleId, roleName, sid, activeDayReward.reward); - userGuild = await UserGuildModel.updateInfo(roleId, { receivedActive: activeDayReward.activeDayPoint }, {}, 'receivedActive'); + userGuild = await UserGuildModel.updateInfo(roleId, { receivedActive: userGuild.receivedActive }, {}, 'receivedActive'); return resResult(STATUS.SUCCESS, { goods, receivedActive: userGuild.receivedActive }); } diff --git a/game-server/app/services/guildService.ts b/game-server/app/services/guildService.ts index de4fe96c2..db192ecb8 100644 --- a/game-server/app/services/guildService.ts +++ b/game-server/app/services/guildService.ts @@ -46,7 +46,7 @@ export async function joinGuild(code: string, lv: number, roleId: string, server return { status: 0, resResult: resResult(STATUS.DIC_DATA_NOT_FOUND) }; } const maxMemberCnt = dicCenterBase.peopleNum; - const guild = await GuildModel.addGuild(code, roleId, maxMemberCnt, serverId); + const guild = await GuildModel.addGuild(code, roleId, maxMemberCnt, serverId, result.ce); if(!guild) { return { status: 0, resResult: resResult(STATUS.GUILD_MEMBER_MAX) }; } @@ -123,13 +123,14 @@ export async function addActive(roleId: string, serverId: number, id: number, ac */ export async function getUserGuildWithRefActive(roleId: string, select: string) { let userGuild = await UserGuildModel.getMyGuild(roleId, select? select + ' +refTimeDaily': '+refTimeDaily'); + console.log(JSON.stringify(userGuild)) if(!userGuild) return false; let { receivedActive, refTimeDaily, activeDaily, activeRecord } = userGuild; const now = new Date(); let isRefDaily = shouldRefresh(refTimeDaily, now, 0); if(isRefDaily) { - receivedActive = 0; refTimeDaily = now; activeDaily = 0; activeRecord = []; + receivedActive = []; refTimeDaily = now; activeDaily = 0; activeRecord = []; userGuild = await UserGuildModel.updateInfo(roleId, { receivedActive, refTimeDaily, activeDaily, activeRecord }, {}, select); if(!userGuild) return false; @@ -149,9 +150,9 @@ export async function settleGuildWeekly() { for(let { code, activeWeekly, memberCnt } of guildList) { const userGuildList = await UserGuildModel.getListByGuild(code, 'roleId auth activeWeekly', { activeWeekly: -1, activeUpdateTime: 1 }); - let activeMemberCnt = 0; // 活跃度高于100的成员人数 - let otherMemberNum = 0; // 除了大将军以外从活跃高到底成员人数,用户计算活跃排名百分比 - let jobCnt = new Map(); + let activeMemberCnt = 0; // 活跃度高于1000的成员人数 + let otherMemberCnt = 0; // 除了大将军以外从活跃高到底成员人数,用户计算活跃排名百分比 + let jobNum = 0; // 职位分配权重加成 let members = new Map(); for(let {roleId, auth, activeWeekly} of userGuildList) { @@ -168,17 +169,15 @@ export async function settleGuildWeekly() { } else if (activeWeekly <= ARMY.ARMY_WEEKHONOUR_LIMIT) { job = GUILD_JOB.SHIBING; } else { - otherMemberNum++; + otherMemberCnt++; for(let [id, {rankProportion}] of gameData.guildPosition) { let rankCnt = Math.ceil(memberCnt * rankProportion / 100); - console.log('*', id, memberCnt, rankProportion, otherMemberNum, rankCnt) job = id; - if(otherMemberNum < rankCnt) break; + if(otherMemberCnt < rankCnt) break; } } await UserGuildModel.updateInfo(roleId, { job, activeWeekly: 0 }); - if(!jobCnt.has(job)) jobCnt.set(job, 0); - jobCnt.set(job, jobCnt.get(job) + 1); + jobNum += gameData.guildPosition.get(job).activeRatio; members.set(roleId, {job, active}); } @@ -190,8 +189,8 @@ export async function settleGuildWeekly() { let positionBase = ratio * ARMY.ARMY_POSITION_WEEKREWARD / 100; // 30% 职位均分 for(let [roleId, {job, active}] of members) { let myAverageRatio = active? (averageBase / activeMemberCnt): 0; - let jobActiveRatio = gameData.guildPosition.get(job).activeRatio / 100; - let myJobRewardRatio = positionBase * jobActiveRatio / jobCnt.get(job); + let jobActiveRatio = gameData.guildPosition.get(job).activeRatio / jobNum; + let myJobRewardRatio = positionBase * jobActiveRatio; let reward = allWeeklyReward.map(cur => { return { id: cur.id, diff --git a/shared/db/Guild.ts b/shared/db/Guild.ts index 46093d33c..d8f8df1da 100644 --- a/shared/db/Guild.ts +++ b/shared/db/Guild.ts @@ -126,8 +126,8 @@ export default class Guild extends BaseModel { return result; } - public static async addGuild(code: string, roleId: string, maxMemberCnt: number, serverId: number) { - let result: GuildType = await GuildModel.findOneAndUpdate({ code, memberCnt: {$lt: maxMemberCnt }, serverId }, { $inc: { memberCnt: 1 }, $push: { members: roleId } }, { new: true }).lean(); + public static async addGuild(code: string, roleId: string, maxMemberCnt: number, serverId: number, ce: number) { + let result: GuildType = await GuildModel.findOneAndUpdate({ code, memberCnt: {$lt: maxMemberCnt }, serverId }, { $inc: { memberCnt: 1, guildCe: ce }, $push: { members: roleId } }, { new: true }).lean(); if(result && result.memberCnt >= maxMemberCnt) { result = await GuildModel.findOneAndUpdate({ code }, { $set: { isMemberMax: true } }).lean(); } @@ -166,7 +166,12 @@ export default class Guild extends BaseModel { } public static async findGuild(code: string, serverId: number, select?: string, lean = true) { - const result = await GuildModel.findOne({ code, status: GUILD_STATUS.RUNNING, serverId }).select(select).lean(lean); + const result: GuildType = await GuildModel.findOne({ code, status: GUILD_STATUS.RUNNING, serverId }).select(select).lean(lean); + return result; + } + + public static async updateCe(roleId: string, inc: number ) { + const result = await GuildModel.findOneAndUpdate({ $elemMatch: {members: roleId}, status: GUILD_STATUS.RUNNING}, {$inc: {guildCe: inc}}, {new: true}).lean(); return result; } } diff --git a/shared/db/UserGuild.ts b/shared/db/UserGuild.ts index 036b8257f..de533dd01 100644 --- a/shared/db/UserGuild.ts +++ b/shared/db/UserGuild.ts @@ -42,8 +42,8 @@ export default class UserGuild extends BaseModel { @prop({ required: true, type: ActiveRecord, default: [], _id: false }) activeRecord: ActiveRecord[]; - @prop({ required: true, default: 0 }) - receivedActive: number; + @prop({ required: true, type: Number, default: [] }) + receivedActive: number[]; @prop({ required: true, default: new Date(), select: false }) refTimeDaily: Date; diff --git a/shared/pubUtils/playerCe.ts b/shared/pubUtils/playerCe.ts index c8564a38e..13701d641 100644 --- a/shared/pubUtils/playerCe.ts +++ b/shared/pubUtils/playerCe.ts @@ -19,6 +19,7 @@ import { getTeraphAttr, HEROTARIN } from '../consts/constModules/abilityConst' import { PvpDefenseModel } from '../db/PvpDefense'; const HERO_CE_RATIO = 100; import { findIndex } from 'underscore'; +import { GuildModel } from '../db/Guild'; //战力计算TODO export function calPlayerCe(globalCeAttr: CeAttrRole, hero: HeroType, type: number, args: Array = []) { let heroCe = 0; @@ -118,6 +119,7 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array, role.ce += incPlayerCe; let { topFive, topFiveCe } = role; await RoleModel.updateRoleInfo(roleId, { globalCeAttr: role.globalCeAttr, ce: role.ce, topFive, topFiveCe }); + await GuildModel.updateCe(roleId, incPlayerCe); return { pushHeros, role, topFiveCe } } diff --git a/shared/resource/jsons/dic_army_authority.json b/shared/resource/jsons/dic_army_authority.json index 26d2ebf60..f0336d22e 100755 --- a/shared/resource/jsons/dic_army_authority.json +++ b/shared/resource/jsons/dic_army_authority.json @@ -138,5 +138,10 @@ "id": 28, "name": "被弹劾", "authority": "1&" + }, + { + "id": 29, + "name": "领取活跃宝箱", + "authority": "1&2&3" } ] \ No newline at end of file