diff --git a/game-server/app/servers/battle/handler/guildHandler.ts b/game-server/app/servers/battle/handler/guildHandler.ts index 19634bf04..458f27096 100644 --- a/game-server/app/servers/battle/handler/guildHandler.ts +++ b/game-server/app/servers/battle/handler/guildHandler.ts @@ -1,17 +1,17 @@ import { Application, BackendSession, pinus } from 'pinus'; import { resResult, getRandEelm, reduceCe } from '../../../pubUtils/util'; -import { STATUS, GUILD_OPERATE, GUILD_AUTH, GUILD_JOB, GUILD_APPLY_TYPE } from '../../../consts'; +import { STATUS, GUILD_OPERATE, GUILD_AUTH, GUILD_JOB, GUILD_APPLY_TYPE, GUILD_STRUCTURE } from '../../../consts'; import { UserGuildModel } from '../../../db/UserGuild'; -import { checkAuth, joinGuild } from '../../../services/guildService'; +import { checkAuth, joinGuild, costFund } from '../../../services/guildService'; import { GuildModel, GuildType } from '../../../db/Guild'; -import Role, { RoleModel, RoleType } from '../../../db/Role'; +import { RoleModel, RoleType } from '../../../db/Role'; import { GUILD } from '../../../pubUtils/dicParam'; import { handleCost } from '../../../services/rewardService'; import { getGoldObject } from '../../../pubUtils/itemUtils'; -import { getSeconds, nowSeconds, getBeforeDaySeconds } from '../../../pubUtils/timeUtil'; +import { nowSeconds, getBeforeDaySeconds } from '../../../pubUtils/timeUtil'; import { GuildListInfo } from '../../../pubUtils/interface'; import { UserGuildApplyModel } from '../../../db/UserGuildApply'; -import User from '../../../db/User'; +import { hasStructureConsume, getStructureConsume, gameData } from '../../../pubUtils/data'; export default function (app: Application) { return new GuildHandler(app); @@ -132,6 +132,7 @@ export class GuildHandler { async setAuth(msg: { roleId: string, auth: number }, session: BackendSession) { const roleId = session.get('roleId'); + const serverId = session.get('serverId'); const { roleId: memberRoleId, auth } = msg; const myUserGuild = await UserGuildModel.getMyGuild(roleId, 'auth guildCode'); @@ -149,23 +150,39 @@ export class GuildHandler { return resResult(STATUS.GUILD_AUTH_NOT_CHANGE); } - // TODO 管理员最大数 等策划表 + // 管理员最大数 等策划表 + let guild = await GuildModel.findByCode(code, serverId, 'managerCnt lv'); + if(!guild) { + return resResult(STATUS.GUILD_NOT_FOUND); + } + + let managerCntInc = 0; + if(auth == GUILD_AUTH.LEADER) { // 转让团长 + managerCntInc = hisUserGuild.auth == GUILD_AUTH.MANAGER?-1: 0; + } else { + managerCntInc = auth == GUILD_AUTH.MANAGER? 1: -1; + } + + let maxManagerCnt = gameData.centerBase.get(guild.lv); + if(!maxManagerCnt) return STATUS.DIC_DATA_NOT_FOUND; + + if(guild.managerCnt + managerCntInc > maxManagerCnt.managerNum) { + return resResult(STATUS.GUILD_MANAGER_REACH_MAX); + } const userGuild = await UserGuildModel.updateInfo(memberRoleId, { auth }, 'auth'); // 设置权限 if(!userGuild) { return resResult(STATUS.GUILD_MEMBER_NOT_FOUND); } - let managerCntInc = 0; + let updateObject = {}; if(auth == GUILD_AUTH.LEADER) { // 转让团长 - managerCntInc = hisUserGuild.auth == GUILD_AUTH.MANAGER?-1: 0; const role = await RoleModel.findByRoleId(memberRoleId); updateObject['leader'] = role._id; await UserGuildModel.updateInfo(roleId, { auth: GUILD_AUTH.MEMBER }); // 自己降权限 - } else { - managerCntInc = auth == GUILD_AUTH.MANAGER? 1: -1; } - const guild = await GuildModel.updateInfo(code, updateObject, { managerCnt: managerCntInc }, 'managerCnt'); // 如果有转让团长设置leader + + guild = await GuildModel.updateInfo(code, updateObject, { managerCnt: managerCntInc }, 'managerCnt'); // 如果有转让团长设置leader // 返回 return resResult(STATUS.SUCCESS, { roleId: memberRoleId, auth: userGuild.auth, managerCnt: guild.managerCnt @@ -568,4 +585,49 @@ export class GuildHandler { code, managerCnt: guild.managerCnt, leader }); } + + // 升级建筑物等级 + async upStructure(msg: { code: string, id: number }, session: BackendSession) { + + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const { code, id } = msg; + + // 升级建筑物权限 + const checkResult = await checkAuth(GUILD_OPERATE.UP_STRUCTURE, roleId, code); + if (!checkResult) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); + + const guild = await GuildModel.findByCode(code, serverId, 'lv structure'); + if(!guild) { + return resResult(STATUS.GUILD_NOT_FOUND); + } + + // TODO 加写锁 + const { lv, structure } = guild; + const curStructure = structure.find(cur => cur.id == id); + if(!curStructure) { + return resResult(STATUS.GUILD_STRUCTURE_NOT_FOUND); + } + if(id != GUILD_STRUCTURE.ARMY_CENTER && curStructure.lv >= lv) { // 中军大帐以外建筑物 + if(curStructure.lv >= lv) { + return resResult(STATUS.GUILD_STRUCTURE_LV_MAX); + } + } + if(!hasStructureConsume(id, curStructure.lv + 1)) { + return resResult(STATUS.GUILD_STRUCTURE_LV_MAX); + } + const cost = getStructureConsume(id, curStructure.lv); + const costResult = await costFund(code, cost, sid); + if(!costResult) { + return resResult(STATUS.GUILD_FUND_NOT_ENOUGH); + } + + const result = await GuildModel.upStructure(code, id, 'code fund structure lv'); + if(!result) { + return resResult(STATUS.GUILD_STRUCTURE_NOT_FOUND); + } + + return resResult(STATUS.SUCCESS, result); + } } \ No newline at end of file diff --git a/game-server/app/services/guildService.ts b/game-server/app/services/guildService.ts index 8044d38e6..0eae3b64a 100644 --- a/game-server/app/services/guildService.ts +++ b/game-server/app/services/guildService.ts @@ -34,8 +34,11 @@ export async function joinGuild(code: string, lv: number, roleId: string, server return { status: 0, resResult: resResult(STATUS.GUILD_HAS_JOIN) }; } - // TODO 读策划表获取最大人数 - const maxMemberCnt = 10; + const dicCenterBase = gameData.centerBase.get(lv); + if(!dicCenterBase) { + return { status: 0, resResult: resResult(STATUS.DIC_DATA_NOT_FOUND) }; + } + const maxMemberCnt = dicCenterBase.peopleNum; const guild = await GuildModel.addGuild(code, roleId, maxMemberCnt, serverId); if(!guild) { return { status: 0, resResult: resResult(STATUS.GUILD_MEMBER_MAX) }; @@ -50,4 +53,10 @@ export async function joinGuild(code: string, lv: number, roleId: string, server await UserGuildApplyModel.deleteApply(roleId); // 删除玩家所有对其他公会的申请 return { status: 1, guild, userGuild } +} + +export async function costFund(code: string, cost: number, sid: string) { + const guild = await GuildModel.costFund(code, cost); + // TODO 推送 + return guild; } \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index fa1479c11..8eb67eecc 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -138,6 +138,10 @@ export const STATUS = { GUILD_AUTH_NOT_CHANGE: { code: 20911, simStr: '权限未发生变化' }, GUILD_MEMBER_NOT_FOUND: { code: 20912, simStr: '未找到该成员' }, GUILD_LEADER_LOGIN: { code: 20913, simStr: '团长未离线满72小时' }, + GUILD_STRUCTURE_NOT_FOUND: { code: 20914, simStr: '未找到该建筑物' }, + GUILD_STRUCTURE_LV_MAX: { code: 20915, simStr: '建筑物已升至满级' }, + GUILD_FUND_NOT_ENOUGH: { code: 20916, simStr: '资金不足' }, + GUILD_MANAGER_REACH_MAX: { code: 20917, simStr: '管理员人数达到最大' }, // 通用 30000 - 30099 DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' }, diff --git a/shared/db/Guild.ts b/shared/db/Guild.ts index 84dd5965c..2a4e22d15 100644 --- a/shared/db/Guild.ts +++ b/shared/db/Guild.ts @@ -145,6 +145,21 @@ export default class Guild extends BaseModel { const result = await GuildModel.findOneAndUpdate({ code }, { $set: update, $inc: incParam }, { new: true }).select(select).lean(); return result; } + + public static async upStructure(code: string, id: number, select?: string) { + if (id == GUILD_STRUCTURE.ARMY_CENTER) { + const result = await GuildModel.findOneAndUpdate({ code, 'structure.id': id }, { $inc: { 'structure.$.lv': 1, lv: 1 }, $set: { isMemberMax: false } }, { new: true }).select(select).lean(); + return result; + } else { + const result = await GuildModel.findOneAndUpdate({ code, 'structure.id': id }, { $inc: { 'structure.$.lv': 1 } }, { new: true }).select(select).lean(); + return result; + } + } + + public static async costFund(code: string, cost: number) { + const result = await GuildModel.findOneAndUpdate({ code, fund: {$gte: cost}}, { $inc: { fund: -1 * cost } }, {new: true}).lean(); + return result; + } } export const GuildModel = getModelForClass(Guild); diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index d7128d463..c18157c11 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -318,4 +318,8 @@ export function getResultMaxRank() { export function getStructureConsume(structureId: number, level: number) { return gameData.structureConsume.get(structureId).get(level); +} + +export function hasStructureConsume(structureId: number, level: number) { + return gameData.structureConsume.get(structureId).has(level); } \ No newline at end of file diff --git a/shared/pubUtils/dictionary/DicStructure.ts b/shared/pubUtils/dictionary/DicStructure.ts index 60940b566..ed8671ad5 100644 --- a/shared/pubUtils/dictionary/DicStructure.ts +++ b/shared/pubUtils/dictionary/DicStructure.ts @@ -144,7 +144,7 @@ const DicStoreKeys: KeysEnum = { storeGoods: true }; -export const dicStructureConsume = new Map>(); // 升级消耗 structureId => level => consume +export const dicStructureConsume = new Map>(); // 升级消耗 structureId => level => consume export const dicCenterBase = new Map(); // 中军大帐 export const dicEquipPriduceBase = new Map(); // 炼器堂 export const dicBossBase = new Map(); // 演武台 @@ -226,8 +226,9 @@ arrStore = undefined; // 升级消耗 function setStructureConsume(o) { let map = dicStructureConsume.get(o.structureId); - if(!map) map = new Map(); - map.set(o.level, parseGoodStr(o.consume)); + if(!map) map = new Map(); + map.set(o.level, o.consume); + dicStructureConsume.set(o.structureId, map); } // {"type": number, "count": number}