升级建筑物
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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: '数据表未找到' },
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -144,7 +144,7 @@ const DicStoreKeys: KeysEnum<DicStoreBase> = {
|
||||
storeGoods: true
|
||||
};
|
||||
|
||||
export const dicStructureConsume = new Map<number, Map<number, RewardInter[]>>(); // 升级消耗 structureId => level => consume
|
||||
export const dicStructureConsume = new Map<number, Map<number, number>>(); // 升级消耗 structureId => level => consume
|
||||
export const dicCenterBase = new Map<number, DicCentreBase>(); // 中军大帐
|
||||
export const dicEquipPriduceBase = new Map<number, DicEquipProduceBase>(); // 炼器堂
|
||||
export const dicBossBase = new Map<number, DicBossBase>(); // 演武台
|
||||
@@ -226,8 +226,9 @@ arrStore = undefined;
|
||||
// 升级消耗
|
||||
function setStructureConsume(o) {
|
||||
let map = dicStructureConsume.get(o.structureId);
|
||||
if(!map) map = new Map<number, RewardInter[]>();
|
||||
map.set(o.level, parseGoodStr(o.consume));
|
||||
if(!map) map = new Map<number, number>();
|
||||
map.set(o.level, o.consume);
|
||||
dicStructureConsume.set(o.structureId, map);
|
||||
}
|
||||
|
||||
// {"type": number, "count": number}
|
||||
|
||||
Reference in New Issue
Block a user