🐞 fix(gvg): 修复农田特殊种子加成逻辑
This commit is contained in:
@@ -69,7 +69,7 @@ export class GVGProduceHandler {
|
||||
const { type } = msg;
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -102,7 +102,7 @@ export class GVGProduceHandler {
|
||||
const { farmId } = msg;
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -142,7 +142,7 @@ export class GVGProduceHandler {
|
||||
const { farmId } = msg;
|
||||
|
||||
let { period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -160,7 +160,7 @@ export class GVGProduceHandler {
|
||||
}
|
||||
|
||||
// 种田
|
||||
async plant(msg: { farmId: number, seeds: { fieldId: number, seedType: number }[] }, session: BackendSession) {
|
||||
async plant(msg: { farmId: number, seeds: { fieldId: number, seedType: number, index: number }[] }, session: BackendSession) {
|
||||
const roleId = session.get('roleId');
|
||||
const serverId = session.get('serverId');
|
||||
const guildCode = session.get('guildCode');
|
||||
@@ -168,7 +168,7 @@ export class GVGProduceHandler {
|
||||
|
||||
const { farmId, seeds } = msg;
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -182,14 +182,14 @@ export class GVGProduceHandler {
|
||||
const cities = await getGVGCities(myLeague);
|
||||
const leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
|
||||
|
||||
const cost: RewardInter[] = [], updateFields: { fieldId: number, seedType: number, time: number, output: number, outputStr: string }[] = [];
|
||||
for(let { fieldId, seedType } of seeds) {
|
||||
const cost: RewardInter[] = [], updateFields: { fieldId: number, seedType: number, index: number, time: number, output: number, outputStr: string }[] = [];
|
||||
for(let { fieldId, seedType, index } of seeds) {
|
||||
let itemId = getItemIdOfSeedType(seedType);
|
||||
let dicItem = gameData.gvgItem.get(itemId);
|
||||
let field = fields.find(cur => cur.fieldId == field);
|
||||
let field = fields.find(cur => cur.fieldId == fieldId);
|
||||
if(!field) continue;
|
||||
let output = calFarmOutput(seedType, field.addType, farmId, cities, leaguePrepare?.activeTech||[]);
|
||||
updateFields.push({ fieldId, seedType, time: dicItem.ripeTime, ...output });
|
||||
updateFields.push({ fieldId, seedType, index, time: dicItem.ripeTime, ...output });
|
||||
// 算消耗的种子
|
||||
let costObj = cost.find(({ id }) => id == itemId);
|
||||
costObj? costObj.count++: cost.push({ id: itemId, count: 1 });
|
||||
@@ -199,7 +199,7 @@ export class GVGProduceHandler {
|
||||
|
||||
const plantResult = await GVGLeagueFarmModel.plant(configId, myLeague.leagueCode, farmId, updateFields, roleId);
|
||||
await rollbackUnPlantFields(cost, plantResult, session, myLeague.leagueCode); // 可能会有田已经被其他人占领的情况,将种子还回去
|
||||
await GVGLeagueFarmRecModel.insertRecs(plantResult);
|
||||
await GVGLeagueFarmRecModel.insertRecs(GVG_RESOURCE_TYPE.FOOD, plantResult);
|
||||
checkGVGTask(serverId, roleId, sid, configId, myLeague.leagueCode, TASK_TYPE.GVG_FARM, { count: 1 });
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
@@ -216,7 +216,7 @@ export class GVGProduceHandler {
|
||||
|
||||
const { farmId, fieldIds } = msg;
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -268,7 +268,7 @@ export class GVGProduceHandler {
|
||||
|
||||
const { farmId, fieldId } = msg;
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -303,7 +303,7 @@ export class GVGProduceHandler {
|
||||
if(!checkItemCanUserInFarm(farmId, itemId)) return resResult(STATUS.GVG_ITEM_CANNOT_USE);
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -333,7 +333,7 @@ export class GVGProduceHandler {
|
||||
|
||||
const { farmId, fieldId, result } = msg;
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -390,7 +390,7 @@ export class GVGProduceHandler {
|
||||
const { farmId } = msg;
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -430,7 +430,7 @@ export class GVGProduceHandler {
|
||||
if(!checkItemCanUserInFarm(farmId, itemId)) return resResult(STATUS.GVG_ITEM_CANNOT_USE);
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -460,7 +460,7 @@ export class GVGProduceHandler {
|
||||
|
||||
const { farmId, fieldId, result } = msg;
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { isArray, isBoolean, isNumber, isString } from "underscore";
|
||||
import { BLOCK_OPEATE, DEBUG_MAGIC_WORD, GM_MAIL_TYPE, GUILD_AUTH, GUILD_STRUCTURE, GVG_RESOURCE_TYPE, LEAGUE_JOB, LINEUP_NUM, MSG_TYPE } from "../consts";
|
||||
import { BLOCK_OPEATE, DEBUG_MAGIC_WORD, GM_MAIL_TYPE, GUILD_AUTH, GUILD_STRUCTURE, GVG_RESOURCE_TYPE, GVG_SEED_TYPE, LEAGUE_JOB, LINEUP_NUM, MSG_TYPE } from "../consts";
|
||||
import { pvpEndParamInter } from "../pubUtils/interface";
|
||||
import { isDevelopEnv } from "./utilService";
|
||||
|
||||
@@ -1356,8 +1356,9 @@ export function checkRouteParam(route: string, msg: any) {
|
||||
{
|
||||
if(!checkNaturalNumbers(msg.farmId)) return false;
|
||||
if(!checkArrayCanEmpty(msg.seeds)) return false;
|
||||
for(let { fieldId, seedType } of msg.seeds) {
|
||||
if(!checkNaturalNumbers(fieldId, seedType)) return false;
|
||||
for(let { fieldId, seedType, index } of msg.seeds) {
|
||||
if(!checkNaturalNumbers(fieldId, seedType, index)) return false;
|
||||
if(!checkIsInEnum(GVG_SEED_TYPE, seedType)) return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ export async function addResource(leagueCode: string, roleId: string, roleName:
|
||||
let myDistribute = getMyDistribute(userDailyData);
|
||||
addResourceRecord(roleId, roleName, leagueCode, resourceType, count);
|
||||
|
||||
return { resource: league.resources, lv: league.lv, myDistribute }
|
||||
return { resource: league.resources, leagueLv: league.lv, myDistribute }
|
||||
}
|
||||
|
||||
function getResourceCnt(resourceType: GVG_RESOURCE_TYPE, count: number) {
|
||||
@@ -144,6 +144,7 @@ export async function lockField(leagueCode: string, roleId: string, roleName: st
|
||||
let { configId } = getGVGConfig();
|
||||
const produceCoinCnt = await getLockFieldCnt(leagueCode, roleId);
|
||||
if(produceCoinCnt == 0) return
|
||||
|
||||
const leagueFarms = await GVGLeagueFarmModel.findByFarmId(configId, leagueCode, farmId);
|
||||
// 查询现有的田
|
||||
let { maxAddTypeCntMap, myAddTypeCntMap, allLands, myFieldCnt, myLockField } = calCntFromFarms(farmId, leagueFarms, roleId);
|
||||
@@ -175,19 +176,21 @@ function calCntFromFarms(farmId: number, leagueFarms: GVGLeagueFarmType[], roleI
|
||||
let myLockField = 0; // 玩家没有种只是锁住了的田
|
||||
let allLands = getArrayOfNumber(gameData.gvgResource.get(farmId)?.sum??0); // 全部可使用的田
|
||||
for(let leagueFarm of leagueFarms) {
|
||||
// 全联军
|
||||
if(leagueFarm.addType) maxAddTypeCntMap.set(leagueFarm.addType, maxAddTypeCntMap.get(leagueFarm.addType) - 1);
|
||||
// 加成
|
||||
for(let {addType, roleId: addTypeRoleId} of leagueFarm.addTypes) {
|
||||
maxAddTypeCntMap.set(addType, maxAddTypeCntMap.get(addType) - 1);
|
||||
if(addTypeRoleId == roleId) {
|
||||
if(!myAddTypeCntMap.has(addType)) myAddTypeCntMap.set(addType, 0);
|
||||
myAddTypeCntMap.set(addType, myAddTypeCntMap.get(addType) + 1);
|
||||
}
|
||||
}
|
||||
if(leagueFarm.unlockTime >= nowSeconds()) {
|
||||
let index = allLands.indexOf(leagueFarm.fieldId);
|
||||
if(index > -1) allLands.splice(index);
|
||||
if(index > -1) allLands.splice(index, 1);
|
||||
}
|
||||
|
||||
// 玩家数据
|
||||
if(leagueFarm.lockRoleId == roleId && leagueFarm.unlockTime >= nowSeconds()) {
|
||||
if(leagueFarm.addType) {
|
||||
if(!myAddTypeCntMap.has(leagueFarm.addType)) myAddTypeCntMap.set(leagueFarm.addType, 0);
|
||||
myAddTypeCntMap.set(leagueFarm.addType, myAddTypeCntMap.get(leagueFarm.addType) + 1);
|
||||
}
|
||||
myFieldCnt++;
|
||||
if(leagueFarm.harvestTime == 0) myLockField++;
|
||||
}
|
||||
@@ -205,36 +208,18 @@ function calCntFromFarms(farmId: number, leagueFarms: GVGLeagueFarmType[], roleI
|
||||
*/
|
||||
function calAddType(myFieldCnt: number, myAddTypeCntMap: Map<number, number>, maxAddTypeCntMap: Map<number, number>, count: number) {
|
||||
let result = new Map<number, number>(); // 加成类型, 数量
|
||||
let minSpField = Math.floor((myFieldCnt + count) * gameData.gvgSpFieldRatio.min / 100); // 最少需要这么多个特殊田
|
||||
let maxSpField = Math.floor((myFieldCnt + count) * gameData.gvgSpFieldRatio.max / 100); // 最多可以有这么多个特殊田
|
||||
let myAllAddFieldCnt = 0;
|
||||
for(let [_, cnt] of myAddTypeCntMap) myAllAddFieldCnt += cnt;
|
||||
if(myAllAddFieldCnt >= maxSpField) return result;
|
||||
|
||||
let randCnt = getRandValueByMinMax(minSpField, maxSpField);
|
||||
|
||||
for(let [addType, ratio] of gameData.gvgFieldAddType) { // 按比例加田
|
||||
for(let [addType, ratio] of gameData.gvgPlayerFieldAddType) { // 按比例加田
|
||||
let maxCnt = maxAddTypeCntMap.get(addType)||0;
|
||||
if(maxCnt == 0) continue;
|
||||
let cnt = Math.ceil(randCnt * ratio / 100);
|
||||
let resultCnt = maxCnt > cnt? cnt: maxCnt;
|
||||
myAllAddFieldCnt += resultCnt;
|
||||
maxAddTypeCntMap.set(addType, maxAddTypeCntMap.get(addType) - 1);
|
||||
let needCnt = Math.floor((myFieldCnt + count) * ratio / 100); // 玩家按照比例需要的加成数量
|
||||
let cnt = myAddTypeCntMap.get(addType)||0; // 我当前的加成数量
|
||||
let resultCnt = needCnt - cnt;
|
||||
if(resultCnt < 0) resultCnt = 0;
|
||||
if(resultCnt > maxCnt) resultCnt = maxCnt;
|
||||
maxAddTypeCntMap.set(addType, maxAddTypeCntMap.get(addType) - resultCnt);
|
||||
result.set(addType, resultCnt);
|
||||
}
|
||||
if(myAllAddFieldCnt < minSpField) {
|
||||
for(let [addType, addCnt] of result) { // 如果还有多的塞一塞
|
||||
let maxCnt = maxAddTypeCntMap.get(addType)||0;
|
||||
if(maxCnt > addCnt) {
|
||||
let inc = maxCnt - addCnt > minSpField - myAllAddFieldCnt? minSpField - myAllAddFieldCnt: maxCnt - addCnt;
|
||||
result.set(addType, count + inc);
|
||||
myAllAddFieldCnt += inc;
|
||||
if(myAllAddFieldCnt >= minSpField) break;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,13 @@ import { genCode } from '../pubUtils/util';
|
||||
import { GVG } from '../pubUtils/dicParam';
|
||||
import { GVG_RESOURCE_TYPE } from '../consts';
|
||||
|
||||
class AddType {
|
||||
@prop({ required: true })
|
||||
addType: number; // 加成类型
|
||||
@prop({ required: true })
|
||||
roleId: string; // 加成玩家
|
||||
}
|
||||
|
||||
@index({ leagueCode: 1, configId: 1 })
|
||||
@index({ fieldId: 1 })
|
||||
@index({ batchCode: 1 })
|
||||
@@ -43,7 +50,10 @@ export default class GVGLeagueFarm extends BaseModel {
|
||||
seedType: number; // 仅农庄使用,实际种的种子类型
|
||||
|
||||
@prop({ required: true })
|
||||
addType: number; // 仅农庄使用,种子加成
|
||||
addType: number; // 仅农庄使用,当前种子加成
|
||||
|
||||
@prop({ required: true, type: AddType, _id: false })
|
||||
addTypes: AddType[]; // 仅农庄使用,历史种子加成
|
||||
|
||||
@prop({ required: true })
|
||||
batchCode: string; // 批量号
|
||||
@@ -57,6 +67,9 @@ export default class GVGLeagueFarm extends BaseModel {
|
||||
@prop({ required: true })
|
||||
outputStr: string; // 产量计算公式
|
||||
|
||||
@prop({ required: true })
|
||||
index: number; // 种植位置
|
||||
|
||||
public static async findByType(configId: number, leagueCode: string, type: number) {
|
||||
const result: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ configId, leagueCode, type }).select('-_id').lean();
|
||||
return result;
|
||||
@@ -92,26 +105,30 @@ export default class GVGLeagueFarm extends BaseModel {
|
||||
public static async lockFields(configId: number, leagueCode: string, farmId: number, roleId: string, roleName: string, lands: { fieldId: number, addType: number }[]) {
|
||||
// 先创建
|
||||
await GVGLeagueFarmModel.bulkWrite(lands.map(({ fieldId }) => {
|
||||
return { updateOne: { filter: { configId, leagueCode, farmId, fieldId }, update: { $setOnInsert: { unlockTime: 0, harvestTime: 0, seedType: 0, addType: 0 } }, upsert: true} }
|
||||
return { updateOne: { filter: { configId, leagueCode, farmId, fieldId }, update: { $setOnInsert: { unlockTime: 0, harvestTime: 0, seedType: 0, addType: 0, addTypes: [] } }, upsert: true} }
|
||||
}));
|
||||
const result = await GVGLeagueFarmModel.bulkWrite(lands.map(({ fieldId, addType }) => {
|
||||
return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, $or:[{ unlockTime: { $lt: nowSeconds() }}, {lockRoleId: roleId, lockRoleName: roleName} ] }, update: { $set: { addType, unlockTime: nowSeconds() + GVG.GVG_FARM_LOCK_TIME, lockRoleId: roleId } } } }
|
||||
if(addType > 0) {
|
||||
return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, $or:[{ unlockTime: { $lt: nowSeconds() }}, {lockRoleId: roleId, lockRoleName: roleName} ] }, update: { $set: { addType, unlockTime: nowSeconds() + GVG.GVG_FARM_LOCK_TIME, lockRoleId: roleId }, $push: { addTypes: { addType, roleId } } } } }
|
||||
} else {
|
||||
return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, $or:[{ unlockTime: { $lt: nowSeconds() }}, {lockRoleId: roleId, lockRoleName: roleName} ] }, update: { $set: { addType, unlockTime: nowSeconds() + GVG.GVG_FARM_LOCK_TIME, lockRoleId: roleId } } } }
|
||||
}
|
||||
}));
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findByFarmIdAndRoleId(configId: number, leagueCode: string, farmId: number, roleId: string) {
|
||||
const result: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ configId, leagueCode, farmId, lockRoleId: roleId, unlockTime: { $gte: nowSeconds() } }).sort({ fieldId: 1 }).select('-_id -createdAt -updatedAt -__v -leagueCode -configId -roleId').lean();
|
||||
const result: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ configId, leagueCode, farmId, lockRoleId: roleId, unlockTime: { $gte: nowSeconds() } }).sort({ index: -1, fieldId: 1 }).select('-_id -createdAt -updatedAt -__v -leagueCode -configId -roleId').lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async plant(configId: number, leagueCode: string, farmId: number, fields: { fieldId: number, seedType: number, time: number, output: number, outputStr: string }[], roleId: string) {
|
||||
public static async plant(configId: number, leagueCode: string, farmId: number, fields: { fieldId: number, seedType: number, time: number, output: number, outputStr: string, index: number }[], roleId: string) {
|
||||
const batchCode = genCode(10);
|
||||
const result = await GVGLeagueFarmModel.bulkWrite(fields.map(({ fieldId, seedType, time, output, outputStr }) => {
|
||||
return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, lockRoleId: roleId }, update: { $set: { seedType, unlockTime: getFutureTime(), harvestTime: nowSeconds() + time, batchCode, output, outputStr }} } }
|
||||
const result = await GVGLeagueFarmModel.bulkWrite(fields.map(({ fieldId, seedType, time, output, outputStr, index }) => {
|
||||
return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, lockRoleId: roleId }, update: { $set: { seedType, unlockTime: getFutureTime(), harvestTime: nowSeconds() + time, batchCode, output, outputStr, index }} } }
|
||||
}));
|
||||
if(result.modifiedCount == 0) return [];
|
||||
const fieldResult: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ batchCode }).sort({ fieldId: 1 }).select('-_id -createdAt -updatedAt -__v -configId -leagueCode').lean();
|
||||
const fieldResult: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ batchCode }).sort({ fieldId: 1 }).select('-_id -createdAt -updatedAt -__v').lean();
|
||||
return fieldResult;
|
||||
}
|
||||
|
||||
@@ -133,7 +150,7 @@ export default class GVGLeagueFarm extends BaseModel {
|
||||
}
|
||||
|
||||
public static async releaseLock(configId: number, leagueCode: string, farmId: number, roleId: string) {
|
||||
await GVGLeagueFarmModel.updateMany({ configId, leagueCode, farmId, lockRoleId: roleId }, { $set: { unlockTime: 0, lockRoleId: '', lockRoleName: '' } });
|
||||
await GVGLeagueFarmModel.updateMany({ configId, leagueCode, farmId, lockRoleId: roleId, index: 0 }, { $set: { unlockTime: 0, lockRoleId: '', lockRoleName: '' } });
|
||||
}
|
||||
|
||||
public static async lockMineOrForestry(configId: number, leagueCode: string, farmId: number, type: number, roleId: string, fieldId: number, itemId: number) {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose';
|
||||
import { GVGLeagueFarmType } from './GVGLeagueFarm';
|
||||
import { GVG_RESOURCE_TYPE } from '../consts';
|
||||
|
||||
@index({ leagueCode: 1, configId: 1, farmId: 1, fieldId: 1 })
|
||||
export default class GVGLeagueFarmRec extends BaseModel {
|
||||
@@ -47,11 +48,11 @@ export default class GVGLeagueFarmRec extends BaseModel {
|
||||
output: number; // 产量
|
||||
|
||||
@prop({ required: false })
|
||||
outputStr: number; // 产量计算公式
|
||||
outputStr: string; // 产量计算公式
|
||||
|
||||
public static async insertRecs(params: GVGLeagueFarmType[]) {
|
||||
public static async insertRecs(type: GVG_RESOURCE_TYPE,params: GVGLeagueFarmType[]) {
|
||||
let insertParams = params.map(field => {
|
||||
return { ...field, startRoleId: field.lockRoleId, startTime: new Date() }
|
||||
return { ...field, startRoleId: field.lockRoleId, startTime: new Date(), type }
|
||||
})
|
||||
await GVGLeagueFarmRecModel.insertMany(insertParams);
|
||||
}
|
||||
|
||||
@@ -317,7 +317,7 @@ export const gameData = {
|
||||
gvgResourceBaseByType: dicGVGResourceBaseByType,
|
||||
gvgResourceBaseByLv: dicGVGResourceBaseByLv,
|
||||
gvgFieldAddType: new Map<number, number>(),
|
||||
gvgSpFieldRatio: { min: 0, max: 0},
|
||||
gvgPlayerFieldAddType: new Map<number, number>(),
|
||||
gvgContributeBox: dicGVGContributeBox,
|
||||
gvgArea: dicGVGArea,
|
||||
gvgCity: dicGVGCity,
|
||||
@@ -1151,12 +1151,10 @@ function parseGVGFieldAdd() {
|
||||
for(let [type, ratio] of arr) {
|
||||
gameData.gvgFieldAddType.set(parseInt(type), parseFloat(ratio));
|
||||
}
|
||||
}
|
||||
|
||||
function parseGVGSpFieldRatio() {
|
||||
let arr = param.GVG.GVG_SP_FIELD_RATIO.split('&');
|
||||
gameData.gvgSpFieldRatio.min = parseFloat(arr[0]);
|
||||
gameData.gvgSpFieldRatio.max = parseFloat(arr[0]);
|
||||
let arr2 = decodeArrayListStr(param.GVG.GVG_SP_FIELD_RATIO);
|
||||
for(let [type, ratio] of arr2) {
|
||||
gameData.gvgPlayerFieldAddType.set(parseInt(type), parseFloat(ratio));
|
||||
}
|
||||
}
|
||||
|
||||
export function getGVGTasksByType(taskType: number) {
|
||||
@@ -1220,7 +1218,6 @@ function parseDicParam() {
|
||||
parseComBattleRewardTime();
|
||||
parseGVGActive();
|
||||
parseGVGFieldAdd();
|
||||
parseGVGSpFieldRatio();
|
||||
parseGVGVestigeCnt();
|
||||
}
|
||||
|
||||
|
||||
@@ -391,12 +391,14 @@ export const GVG = {
|
||||
GVG_FARM_LOCK_TIME: 300, // 农田锁定时间(秒)
|
||||
GVG_MINE_LOCK_TIME: 300, // 矿山锁定时间(秒)
|
||||
GVG_FORESTRY_LOCK_TIME: 300, // 林场锁定时间(秒)
|
||||
GVG_FIELD_TYPE_RATIO: '1&5%|2&10%|3&10%', // 全联盟的特殊格子上限百分比(a%的格子为小麦这个)1&a|2&b|3&c
|
||||
GVG_SP_FIELD_RATIO: '10%&30%', // 分配给玩家的时候有多少特殊格子 min&max 填最大最小百分比即可
|
||||
GVG_FIELD_TYPE_RATIO: '1&5%|2&10%|3&10%', // 全联盟的
|
||||
GVG_SP_FIELD_RATIO: '1&5%|2&10%|3&10%', // 分配给玩家的时候特殊格子上限百分比(a%的格子为小麦这个)1&a|2&b|3&c
|
||||
GVG_REFRESH_TIME: 5, // 0
|
||||
GVG_ROBOT_NAME: '遗迹守卫', // 0
|
||||
GVG_SINGLE_SERVICE_CITY: '1&2&3', // 单服城池
|
||||
GVG_CROSS_SERVICE_CITY: '4&5&6&7&8&9&10&11&12&13', // 跨服城池
|
||||
GVG_VESTIGE_PREPARE_COUNTDOWN: 120, // 遗迹准备界面倒计时(s)
|
||||
GVG_VESTIGE_BATTLE_COUNTDOWN: 300, // 遗迹战斗界面倒计时(s)
|
||||
GVG_VESTIGE_BGMAP_GKID: 80001, // GVG备战期遗迹防守阵容地图所用的关卡id
|
||||
GVG_CITY_BGMAP_GKID: 85001, // GVG激战期防守阵容地图所用的关卡id
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user