Merge branch 'master' of https://gitlab.trgame.cn/zyztech/zyz_server
This commit is contained in:
113
game-server/app/servers/activity/handler/entertainHandler.ts
Normal file
113
game-server/app/servers/activity/handler/entertainHandler.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { Application, BackendSession, HandlerService, } from 'pinus';
|
||||
import { getRandSingleEelm, parseNumberList, resResult } from '../../../pubUtils/util';
|
||||
import { ITEM_CHANGE_REASON, STATUS } from '../../../consts';
|
||||
import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/activity/giftPackageService';
|
||||
import { getPlayerEntertainData, getPlayerEntertainDataShow } from '../../../services/activity/entertainService';
|
||||
import { ActivityEntertainRecModel } from '../../../db/ActivityEntertainRec';
|
||||
import { handleCost } from '../../../services/role/rewardService';
|
||||
|
||||
export default function (app: Application) {
|
||||
new HandlerService(app, {});
|
||||
return new EntertainHandler(app);
|
||||
}
|
||||
|
||||
export class EntertainHandler {
|
||||
constructor(private app: Application) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取火神祭祀活动数据
|
||||
* @param {{ activityId: number}} msg
|
||||
* @param {BackendSession} session
|
||||
* @memberof EntertainHandler
|
||||
*/
|
||||
async getData(msg: { activityId: number }, session: BackendSession) {
|
||||
const { activityId } = msg;
|
||||
const roleId = session.get('roleId');
|
||||
const serverId = session.get('serverId');
|
||||
|
||||
let playerData = await getPlayerEntertainDataShow(activityId, serverId, roleId);
|
||||
|
||||
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
||||
|
||||
return resResult(STATUS.SUCCESS, playerData);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 宴请
|
||||
* @param {{ activityId: number }} msg
|
||||
* @param {BackendSession} session
|
||||
* @memberof EntertainHandler
|
||||
*/
|
||||
async invite(msg: { activityId: number }, session: BackendSession) {
|
||||
const { activityId } = msg;
|
||||
const roleId = session.get('roleId');
|
||||
const roleName = session.get('roleName');
|
||||
const sid = session.get('sid');
|
||||
const serverId = session.get('serverId');
|
||||
|
||||
let playerData = await getPlayerEntertainData(activityId, serverId, roleId);
|
||||
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
||||
// 挑战次数
|
||||
if(playerData.playCnt >= playerData.freeCnt + playerData.buyCnt) return resResult(STATUS.ACTIVITY_ENTERTAIN_NO_NUM);
|
||||
|
||||
let pool = playerData.heroes.filter(hero => {
|
||||
if(hero.num >= hero.maxNum) return false;
|
||||
for(let condition of hero.conditionArr) {
|
||||
if(condition.type == 1 && playerData.invitedHeroNum < condition.param) return false;
|
||||
if(condition.type == 2 && playerData.invitedHids.indexOf(condition.param) == -1) return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
if(pool.length <= 0) return resResult(STATUS.ACTIVITY_ENTERTAIN_NO_NUM);
|
||||
let randResult = getRandSingleEelm(pool);
|
||||
if(!randResult) return resResult(STATUS.ACTIVITY_ENTERTAIN_NO_NUM);
|
||||
|
||||
let rewards = stringToRewardParam(randResult.reward);
|
||||
let playerRecord = await ActivityEntertainRecModel.record(serverId, activityId, playerData.roundIndex, roleId, { todayIndex: playerData.todayIndex, id: randResult.id, hid: randResult.hid, time: new Date(), reward: randResult.reward })
|
||||
let { goods } = await addReward(roleId, roleName, sid, serverId, rewards, ITEM_CHANGE_REASON.ACT_DRAGON_BOAT);
|
||||
randResult.incNum();
|
||||
playerData.updateBuyCnt(playerRecord);
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
activityId,
|
||||
todayPlayCnt: playerData.todayPlayCnt,
|
||||
playCnt: playerData.playCnt,
|
||||
curHero: randResult.getShowResult(),
|
||||
goods
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 购买次数
|
||||
* @param {{ activityId: number, id: number, count: number}} msg
|
||||
* @param {BackendSession} session
|
||||
* @memberof EntertainHandler
|
||||
*/
|
||||
async buyCnt(msg: { activityId: number, count: number }, session: BackendSession) {
|
||||
const { activityId, count } = msg;
|
||||
const roleId = session.get('roleId');
|
||||
const sid = session.get('sid');
|
||||
const serverId = session.get('serverId');
|
||||
|
||||
let playerData = await getPlayerEntertainData(activityId, serverId, roleId);
|
||||
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
||||
|
||||
// 可购买次数
|
||||
if(playerData.buyCnt + count > playerData.maxBuyCnt) return resResult(STATUS.ACTIVITY_ENTERTAIN_BUY_COUNT_OVER);
|
||||
if(playerData.todayPlayCnt < playerData.freeCnt) return resResult(STATUS.ACTIVITY_DRAGON_BOAT_CANNOT_BUY);
|
||||
// 扣材料
|
||||
let costResult = await handleCost(roleId, sid, stringToConsumeParam(playerData.buyCost), ITEM_CHANGE_REASON.ACT_DRAGON_BOAT_BUY_COST);
|
||||
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
// 保存数据
|
||||
let buildResult = await ActivityEntertainRecModel.buyCnt(serverId, activityId, playerData.roundIndex, roleId, count);
|
||||
// // 更新数据
|
||||
playerData.updateBuyCnt(buildResult);
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
activityId,
|
||||
maxBuyCnt: playerData.maxBuyCnt,
|
||||
buyCnt: playerData.buyCnt
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -65,7 +65,8 @@ export class GrowthFundHandler {
|
||||
if (!growthFundItemData.isComplete) {//未完成任务
|
||||
return resResult(STATUS.ACTIVITY_TASK_UNCOMPLETED);
|
||||
}
|
||||
if (playerData.isReceive(pageIndex, cellIndex)) {//已经领取过
|
||||
let hasReceive = await ActivityGrowthFundModel.exists({ roleId, activityId, pageIndex, cellIndex });
|
||||
if (hasReceive) {//已经领取过
|
||||
return resResult(STATUS.ACTIVITY_REWARDED);
|
||||
}
|
||||
|
||||
|
||||
@@ -62,10 +62,14 @@ export class AuctionHandler {
|
||||
}
|
||||
|
||||
const lot = await LotModel.findLot(code);
|
||||
if (!lot || lot.status === LOT_STATUS.SOLD || lot.status === LOT_STATUS.MAX) {
|
||||
if (!lot) {
|
||||
res.releaseCallback();
|
||||
return resResult(STATUS.GUILD_LOT_NOT_FOUND);
|
||||
}
|
||||
if (lot.status === LOT_STATUS.SOLD || lot.status === LOT_STATUS.MAX) {
|
||||
res.releaseCallback();
|
||||
return resResult(STATUS.GUILD_LOT_HAS_SOLD);
|
||||
}
|
||||
|
||||
if (auctionStage === AUCTION_STAGE.GUILD && lot.guildCode !== guildCode) {
|
||||
res.releaseCallback();
|
||||
|
||||
@@ -48,6 +48,7 @@ import { getMonthlyFundData } from './monthlyFundService';
|
||||
import { getPlayerRebateDataShow } from './rebateService';
|
||||
import { getWebviewDataShow } from './webviewService';
|
||||
import { getPlayerDragonBoatDataShow } from './dragonBoatService';
|
||||
import { getPlayerEntertainDataShow } from './entertainService';
|
||||
|
||||
/**
|
||||
* 获取活动数据
|
||||
@@ -274,6 +275,11 @@ export async function getActivity(serverId: number, roleId: string, uid: number,
|
||||
activityData = await getPlayerDragonBoatDataShow(activityId, serverId, roleId);
|
||||
break
|
||||
}
|
||||
case ACTIVITY_TYPE.ENTERTAIN:
|
||||
{
|
||||
activityData = await getPlayerEntertainDataShow(activityId, serverId, roleId);
|
||||
break
|
||||
}
|
||||
default: {
|
||||
console.log('未知活动类型.........', activityType)
|
||||
break;
|
||||
|
||||
38
game-server/app/services/activity/entertainService.ts
Normal file
38
game-server/app/services/activity/entertainService.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { ActivityEntertainRecModel } from "../../db/ActivityEntertainRec";
|
||||
import { EntertainData } from "../../domain/activityField/entertainField";
|
||||
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
|
||||
import { getActivityById } from "./activityService";
|
||||
|
||||
/**
|
||||
* 玩家活动数据
|
||||
*
|
||||
* @param {number} serverId 区Id
|
||||
* @param {number} activityId 活动Id
|
||||
* @param {string} roleId 角色Id
|
||||
*
|
||||
*/
|
||||
export async function getPlayerEntertainData(activityId: number, serverId: number, roleId: string) {
|
||||
let activityData = await getActivityById(activityId);
|
||||
let createTime = await getRoleCreateTime(roleId);
|
||||
let serverTime = await getServerCreateTime(serverId);
|
||||
let playerData = new EntertainData(activityData, createTime, serverTime);
|
||||
let playerRecord = await ActivityEntertainRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
|
||||
playerData.setPlayerRecords(playerRecord);
|
||||
return playerData;
|
||||
}
|
||||
|
||||
/**
|
||||
* 玩家活动数据
|
||||
*
|
||||
* @param {number} serverId 区Id
|
||||
* @param {number} activityId 活动Id
|
||||
* @param {string} roleId 角色Id
|
||||
*
|
||||
*/
|
||||
export async function getPlayerEntertainDataShow(activityId: number, serverId: number, roleId: string) {
|
||||
let playerData = await getPlayerEntertainData(activityId, serverId, roleId);
|
||||
if(playerData && playerData.canShow && playerData.canShow()) {
|
||||
return playerData.getShowResult();
|
||||
}
|
||||
return null
|
||||
}
|
||||
@@ -545,8 +545,8 @@ export async function checkAuctionStage(auctionStage: number, magicWord: string)
|
||||
if(curTime > (await todayWorldBegin()).getTime()) return false
|
||||
}
|
||||
if(auctionStage == AUCTION_STAGE.WORLD) {
|
||||
if(curTime < (await todayWorldBegin()).getTime() - 10 * 60 * 100) return false;
|
||||
if(curTime > (await todayWorldEnd()).getTime() + 10 * 60 * 1000) return false
|
||||
if(curTime < (await todayWorldBegin()).getTime()) return false;
|
||||
if(curTime > (await todayWorldEnd()).getTime()) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { GVGTeamMem } from "../../domain/battleField/gvgBattle";
|
||||
import { GVGLeagueModel, GVGLeagueType } from "../../db/GVGLeague";
|
||||
import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from "../../db/GVGTeam";
|
||||
import GVGTeam, { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from "../../db/GVGTeam";
|
||||
import { GVGCityModel, GVGCityType } from "../../db/GVGCity";
|
||||
import { gameData, getGVGBattleRankReward } from "../../pubUtils/data";
|
||||
import { COUNTER, GVG_AREA_TYPE, GVG_ATTACK_TYPE, GVG_BATTLE_RANK_TYPE, GVG_PERIOD, GVG_POINT_TYPE, GVG_SERVER_TYPE, GVG_TECH_TYPE, MAIL_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts";
|
||||
import { COUNTER, GVG_AREA_TYPE, GVG_ATTACK_TYPE, GVG_BATTLE_RANK_TYPE, GVG_PERIOD, GVG_POINT_TYPE, GVG_SERVER_TYPE, GVG_TECH_TYPE, MAIL_TYPE, PUSH_ROUTE, REDIS_KEY, SERVER_GROUP_FUN_TYPE, STATUS } from "../../consts";
|
||||
import { getTimeFun, nowSeconds } from "../../pubUtils/timeUtil";
|
||||
import { DicGVGAreaPoint } from "../../pubUtils/dictionary/DicGVGAreaPoint";
|
||||
import { getGVGBattleData, getGVGBattleMap } from "../memoryCache/gvgBattleData";
|
||||
@@ -29,6 +29,7 @@ import { HeroModel, HeroType } from "../../db/Hero";
|
||||
import { ArtifactModel } from "../../db/Artifact";
|
||||
import { getHeroesAttributes } from "../playerCeService";
|
||||
import { CounterModel } from "../../db/Counter";
|
||||
import { getGroupIdOfServer } from "../serverService";
|
||||
|
||||
/**
|
||||
* 获取本联军上周占领的城池
|
||||
@@ -353,12 +354,11 @@ export function checkGVGBattleStart(roleId: string, attackTeam: GVGTeamType, def
|
||||
// —————————— 定时器相关 —————————— //
|
||||
// gvg激战期开始定时器
|
||||
export async function gvgBattleStart() {
|
||||
let servers = pinus.app.getServersByType('guild');
|
||||
|
||||
let { configId } = getGVGConfig();
|
||||
let guardCities = await GVGCityModel.findAllGuardCities(configId);
|
||||
for(let { cityId, groupKey, guardLeague, guardLeagueName } of guardCities) {
|
||||
let sid = (await dispatch(redisClient(), cityId.toString(), servers, 'guild'))?.id;
|
||||
let sid = await dispatchTeam(groupKey, cityId);
|
||||
await pinus.app.rpc.guild.guildRemote.initCatapult.toServer(sid, cityId, groupKey, guardLeague, guardLeagueName);
|
||||
}
|
||||
}
|
||||
@@ -774,9 +774,24 @@ export async function initTeamToMem() {
|
||||
let teams = await GVGTeamModel.findByConfigId(configId);
|
||||
for(let team of teams) {
|
||||
if(team.isBroken) continue;
|
||||
if((await dispatch(redisClient(), team.cityId.toString(), servers, 'guild'))?.id == sid) {
|
||||
let dispacthSid = await dispatchTeam(team.groupKey, team.cityId);
|
||||
if(dispacthSid == sid) {
|
||||
let teamObj = getGVGBattleData(team.groupKey);
|
||||
teamObj.enterCity(team);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function dispatchTeam(groupKey: string, cityId: number) {
|
||||
let groupId = '';
|
||||
if(groupKey.startsWith('s')) {
|
||||
let serverId = parseInt(groupKey.slice(1));
|
||||
groupId = (await getGroupIdOfServer(serverId, SERVER_GROUP_FUN_TYPE.GVG)).toString();
|
||||
} else {
|
||||
groupId = groupKey.slice(1);
|
||||
}
|
||||
|
||||
let servers = pinus.app.getServersByType('guild');
|
||||
let sid = (await dispatch(redisClient(), `${groupId}_${cityId}`, servers, 'guild'))?.id;
|
||||
return sid;
|
||||
}
|
||||
@@ -246,9 +246,10 @@ export class SendMailFun {
|
||||
// 生成单人邮件
|
||||
public async createSingleMails(code: string, roleIds: string[]) {
|
||||
let mapTemp = this.mailTemps.get(code);
|
||||
if(mapTemp) console.log('#### createSingleMails', mapTemp.getCreateMailParams()?.contentId, roleIds);
|
||||
if(mapTemp.sendTime < nowSeconds()) return;
|
||||
for(let roleId of roleIds) {
|
||||
console.log('#### createSingleMails this.hideMail', this.hideMail, this.hideMail? MAIL_STATUS.HIDE: MAIL_STATUS.CREATE)
|
||||
// console.log('#### createSingleMails this.hideMail', this.hideMail, this.hideMail? MAIL_STATUS.HIDE: MAIL_STATUS.CREATE)
|
||||
let originMail = await MailModel.addMail({ roleId, status: this.hideMail? MAIL_STATUS.HIDE: MAIL_STATUS.CREATE, ...mapTemp.getCreateMailParams() });
|
||||
this.mails.push(originMail);
|
||||
}
|
||||
|
||||
@@ -342,14 +342,14 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve
|
||||
let curJewel = jewels.find(cur => cur.seqId == jewel);
|
||||
calCe.setJewel(hid, id, stones, curJewel);
|
||||
calCe.setStone(hid, id, stones);
|
||||
calCe.setTitle(role.title);
|
||||
calCe.setTeraph(role.teraphs);
|
||||
}
|
||||
let artifact = artifacts.find(cur => cur.hid == hid);
|
||||
if(artifact) calCe.setPutArtifact(hid, skinId, job, artifact);
|
||||
calCe.setEquipSuit(hid, skinId, ePlace);
|
||||
calCe.setScroll(hid, scrollStar, scrollQuality, scrollColorStar);
|
||||
}
|
||||
calCe.setTitle(role.title);
|
||||
calCe.setTeraph(role.teraphs);
|
||||
|
||||
for(let { schoolId, hid, } of schools) {
|
||||
let curHero = heroes.find(cur => cur.hid == hid);
|
||||
|
||||
@@ -46,15 +46,15 @@ export class CalCe {
|
||||
let lv = this.data.heroLv.get(hid)||1;
|
||||
for(let attrId = ABI_TYPE.ABI_HP; attrId < ABI_TYPE.ABI_MAX; attrId++) {
|
||||
if(!this.data.heroAttrs.has(`${hid}_${attrId}`) && !this.data.globalAttrs.has(attrId)) continue;
|
||||
let { mainBase = 0, mainBaseUp = 0, subBase = 0, job = 0, starUp = 0, connect = 0, talent = 0, equipQuality = 0, equipStrength = 0, equipStar = 0, equipSuit = 0, jewel = 0, stone = 0, artifactLv = 0, artifactQuality = 0, artifactSeid = 0 } = this.data.heroAttrs.get(`${hid}_${attrId}`)||{};
|
||||
let { mainBase = 0, mainBaseUp = 0, subBase = 0, job = 0, starUp = 0, connect = 0, talent = 0, equipQuality = 0, equipStrength = 0, equipStar = 0, equipSuit = 0, jewel = 0, stone = 0, artifactLv = 0, artifactQuality = 0, artifactSeid = 0, jewelBase = 0 } = this.data.heroAttrs.get(`${hid}_${attrId}`)||{};
|
||||
let { school = 0, teraph = 0, title = 0, scroll = 0, skin = 0 } = this.data.getGlobalAttrById(attrId)||{};
|
||||
let val = 0, ceVal = 0, str = '', ceStr = '';
|
||||
if(ABI_TYPE_MAIN.indexOf(attrId) != -1) {
|
||||
// {[ hp1 + lv * hp2 ] * ( 1 + hp5 ) + [( hp6 + hp7 ) * ( 1 + hp8 )]} * ( 1 + hp9 ) + hp10 + hp11 + hp14
|
||||
val = (( mainBase + job + lv * ( starUp + mainBaseUp ) ) * ( 1 + connect/100 ) + (( equipQuality + equipStrength ) * ( 1 + ( equipStar/100 + equipSuit/100 )))) * ( 1 + jewel/100 + school/100 + talent/100 + skin/100 + artifactSeid/100) + stone + teraph + title + scroll + artifactLv + artifactQuality;
|
||||
ceVal = (( mainBase + job + lv * ( starUp + mainBaseUp ) ) * ( 1 + connect/100 ) + (( equipQuality + equipStrength ) * ( 1 + ( equipStar/100 + equipSuit/100 )))) * ( 1 + jewel/100 + school/100 + talent/100 + skin/100 + artifactSeid/100) + stone + teraph + title + scroll + artifactLv + artifactQuality;
|
||||
str += `{[${mainBase}+${job}+${lv}*(${starUp}+${mainBaseUp})]* ( 1 + ${connect}/100) + [(${equipQuality}+${equipStrength}) * ( 1 + ${equipStar}/100+${equipSuit}/100)]} * (1+${jewel}/100+${school}/100+${talent}/100+${skin}/100+${artifactSeid}/100)+${stone}+${teraph}+${title}+${scroll}+${artifactLv}+${artifactQuality}`;
|
||||
ceStr += `{[${mainBase}+${job}+${lv}*(${starUp}+${mainBaseUp})]* ( 1 + ${connect}/100) + [(${equipQuality}+${equipStrength}) * ( 1 + ${equipStar}/100+${equipSuit}/100)]} * (1+${jewel}/100+${school}/100+${talent}/100+${skin}/100+${artifactSeid}/100)+${stone}+${teraph}+${title}+${scroll}+${artifactLv}+${artifactQuality}`;
|
||||
val = (( mainBase + job + lv * ( starUp + mainBaseUp ) ) * ( 1 + connect/100 ) + (( equipQuality + equipStrength ) * ( 1 + ( equipStar/100 + equipSuit/100 )))) * ( 1 + jewel/100 + school/100 + talent/100 + skin/100 + artifactSeid/100) + stone + teraph + title + scroll + artifactLv + artifactQuality + jewelBase;
|
||||
ceVal = (( mainBase + job + lv * ( starUp + mainBaseUp ) ) * ( 1 + connect/100 ) + (( equipQuality + equipStrength ) * ( 1 + ( equipStar/100 + equipSuit/100 )))) * ( 1 + jewel/100 + school/100 + talent/100 + skin/100 + artifactSeid/100) + stone + teraph + title + scroll + artifactLv + artifactQuality + jewelBase;
|
||||
str += `{[${mainBase}+${job}+${lv}*(${starUp}+${mainBaseUp})]* ( 1 + ${connect}/100) + [(${equipQuality}+${equipStrength}) * ( 1 + ${equipStar}/100+${equipSuit}/100)]} * (1+${jewel}/100+${school}/100+${talent}/100+${skin}/100+${artifactSeid}/100)+${stone}+${teraph}+${title}+${scroll}+${artifactLv}+${artifactQuality}+${jewelBase}`;
|
||||
ceStr += `{[${mainBase}+${job}+${lv}*(${starUp}+${mainBaseUp})]* ( 1 + ${connect}/100) + [(${equipQuality}+${equipStrength}) * ( 1 + ${equipStar}/100+${equipSuit}/100)]} * (1+${jewel}/100+${school}/100+${talent}/100+${skin}/100+${artifactSeid}/100)+${stone}+${teraph}+${title}+${scroll}+${artifactLv}+${artifactQuality}+${jewelBase}`;
|
||||
} else {
|
||||
// attr1 + attr2 + attr4 + attr5 + attr6 + attr7 + attr9
|
||||
val = subBase + job + teraph + school + title + jewel + equipStar;
|
||||
@@ -302,6 +302,7 @@ export class CalCe {
|
||||
this.data.clearHeroAttrByHid(hid, 'equipStar');
|
||||
this.data.clearEquipAttrByHid(hid, 'equipStar');
|
||||
this.data.clearHeroAttrByHid(hid, 'jewel');
|
||||
this.data.clearHeroAttrByHid(hid, 'jewelBase');
|
||||
this.data.clearHeroAttrByHid(hid, 'stone');
|
||||
}
|
||||
|
||||
@@ -379,6 +380,8 @@ export class CalCe {
|
||||
public setJewel(hid: number, eplaceId: number, stones: Stone[], jewel: JewelType) {
|
||||
this.data.clearHeroAttrByHid(hid, 'jewel');
|
||||
this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'jewel');
|
||||
this.data.clearHeroAttrByHid(hid, 'jewelBase');
|
||||
this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'jewelBase');
|
||||
let seids: number[] = [];
|
||||
if(jewel) {
|
||||
for(let { id, seid, rand } of jewel.randSe) {
|
||||
@@ -389,6 +392,14 @@ export class CalCe {
|
||||
for(let { seid, rand } of jewel.rareSe) {
|
||||
seids.push(seid, rand);
|
||||
}
|
||||
let dicJewel = gameData.jewel.get(jewel.id);
|
||||
if(dicJewel) {
|
||||
let attrBaseValues = dicJewel.rareEffectBaseAttr||[];
|
||||
for(let { id, num } of attrBaseValues) {
|
||||
let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id);
|
||||
equipAttr.jewelBase = num;
|
||||
}
|
||||
}
|
||||
}
|
||||
let { ratioUp } = this.addSeidEffect(seids);
|
||||
let map = new Map<number, number>(); // attrId => val
|
||||
@@ -404,9 +415,10 @@ export class CalCe {
|
||||
equipAttr.jewel = val;
|
||||
}
|
||||
let equips = this.data.getEquipAttrsByHid(hid);
|
||||
for(let { hid, attrId, jewel } of equips) {
|
||||
for(let { hid, attrId, jewel, jewelBase } of equips) {
|
||||
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
|
||||
heroAttr.jewel += jewel;
|
||||
heroAttr.jewelBase += jewelBase;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1083,6 +1095,7 @@ abstract class HeroAllAttr {
|
||||
artifactLv: number = 0; // hp14 宝物等级(dic_zyz_artifactLvPlan的attr)
|
||||
artifactQuality: number = 0; // hp14 宝物品质(dic_zyz_artifactQualityPlan的attr)
|
||||
artifactSeid: number = 0; // hp9 宝物词条(dic_zyz_artifactSeid算出来的)
|
||||
jewelBase: number = 0; // hp15 天晶固定属性值(jewel的基础属性)
|
||||
|
||||
constructor(hid: number, attrId: number, ) {
|
||||
this.hid = hid;
|
||||
@@ -1139,6 +1152,8 @@ class HeroMainAttr extends HeroAllAttr {
|
||||
this.artifactQuality = value; break;
|
||||
case HERO_MAIN_ATTR_INDEX.ARTIFACT_SEID:
|
||||
this.artifactSeid = value; break;
|
||||
case HERO_MAIN_ATTR_INDEX.JEWEL_BASE:
|
||||
this.jewelBase = value; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1196,6 +1211,9 @@ class HeroMainAttr extends HeroAllAttr {
|
||||
case HERO_MAIN_ATTR_INDEX.ARTIFACT_SEID:
|
||||
values.push(this.artifactSeid);
|
||||
break;
|
||||
case HERO_MAIN_ATTR_INDEX.JEWEL_BASE:
|
||||
values.push(this.jewelBase);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return values;
|
||||
@@ -1257,6 +1275,7 @@ abstract class EquipAllAttr {
|
||||
equipStar: number = 0;
|
||||
jewel: number = 0;
|
||||
stone: number = 0;
|
||||
jewelBase: number = 0;
|
||||
|
||||
constructor(hid: number, attrId: number) {
|
||||
this.hid = hid;
|
||||
@@ -1290,6 +1309,8 @@ class EquipMainAttr extends EquipAllAttr {
|
||||
this.jewel = value; break;
|
||||
case EQUIP_MAIN_ATTR_INDEX.STONE:
|
||||
this.stone = value; break;
|
||||
case EQUIP_MAIN_ATTR_INDEX.JEWEL_BASE:
|
||||
this.jewelBase = value; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1314,6 +1335,9 @@ class EquipMainAttr extends EquipAllAttr {
|
||||
case EQUIP_MAIN_ATTR_INDEX.STONE:
|
||||
values.push(this.stone);
|
||||
break;
|
||||
case EQUIP_MAIN_ATTR_INDEX.JEWEL_BASE:
|
||||
values.push(this.jewelBase);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return values;
|
||||
@@ -1388,6 +1412,7 @@ enum HERO_MAIN_ATTR_INDEX {
|
||||
ARTIFACT_LV = 13, // hp14, 宝物等级
|
||||
ARTIFACT_QUALITY = 14, // hp14, 宝物品质
|
||||
ARTIFACT_SEID = 15, // hp9,宝物词条
|
||||
JEWEL_BASE = 16, // hp15, 天晶基础属性(dic_zyz_jewel的rareEffectBaseAttr)
|
||||
END
|
||||
}
|
||||
|
||||
@@ -1408,6 +1433,7 @@ enum EQUIP_MAIN_ATTR_INDEX {
|
||||
EQUIP_STAR = 2, // hp8, 装备(dic_zyz_equipStar)
|
||||
JEWEL = 3, // hp9, 天晶洗练出的主属性百分比加成,equipAttr加起来
|
||||
STONE = 4, // hp10,地玉石增加的固定值,equipAttr加起来
|
||||
JEWEL_BASE = 5, // hp15, 天晶基础属性(dic_zyz_jewel的rareEffectBaseAttr)
|
||||
END
|
||||
}
|
||||
|
||||
|
||||
@@ -327,15 +327,17 @@ export async function sendSurveyMail(code: string) {
|
||||
}
|
||||
|
||||
export async function sendGiftCodeMail(message: string) {
|
||||
console.log('***** sendSurveyMail', message);
|
||||
console.log('***** sendGiftCodeMail 1', message);
|
||||
let [roleId, _giftId] = message.split('|');
|
||||
let giftId = parseInt(_giftId);
|
||||
console.log('****** sendGiftCodeMail 2', roleId, giftId, isNaN(giftId))
|
||||
if(isNaN(giftId) || !roleId) return false;
|
||||
let giftCode = await GiftCodeModel.findByGiftId(giftId);
|
||||
if(!giftCode) {
|
||||
console.log('***** sendSurveyMail giftId not found', giftId);
|
||||
console.log('***** sendGiftCodeMail giftId not found', giftId);
|
||||
return false;
|
||||
}
|
||||
|
||||
console.log('****** sendGiftCodeMail 3', roleId, giftCode.goods);
|
||||
await sendMailByContent(MAIL_TYPE.SEND_MAIL, roleId, { goods: giftCode.goods, params: ['尊敬的百家传人,附件为您在平台活动获得的奖励,请查收!'] });
|
||||
}
|
||||
@@ -68,6 +68,7 @@ export enum ACTIVITY_TYPE {
|
||||
REBATE = 53, // 返利
|
||||
WEBVIEW = 54, // 平台活动页面
|
||||
DRAGON_BOAT = 55, // 龙舟
|
||||
ENTERTAIN = 56, // 宴请百家
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -269,6 +269,7 @@ export const STATUS = {
|
||||
DIVIDEND_GUILD_PLAYER_ONLY: { code: 21004, simStr: '需要参加军团活动才能领取' },
|
||||
AUCTION_GUILD_MEMBER_ONLY: { code: 21005, simStr: '不是军团的成员无法出价' },
|
||||
AUCITON_STAGE_ERR: { code: 21006, simStr: '拍卖超时,请刷新客户端重新进入' },
|
||||
GUILD_LOT_HAS_SOLD: { code: 21007, simStr: '拍品已售出' },
|
||||
|
||||
// 军团活动 21100-21199
|
||||
GUILD_ACTIVITY_NOT_OPEN: { code: 21100, simStr: '活动未开放' },
|
||||
@@ -683,6 +684,8 @@ export const STATUS = {
|
||||
ACTIVITY_DRAGON_BOAT_ROUTE_HAS_PASS: { code: 50071, simStr: '该节点已经挑战过了' },
|
||||
ACTIVITY_DRAGON_BOAT_BUY_COUNT_OVER: { code: 50072, simStr: '购买挑战次数不足' },
|
||||
ACTIVITY_DRAGON_BOAT_CANNOT_BUY: { code: 50073, simStr: '不可在免费次数未用完的时候购买次数' },
|
||||
ACTIVITY_ENTERTAIN_NO_NUM: { code: 50074, simStr: '宴请武将次数已满' },
|
||||
ACTIVITY_ENTERTAIN_BUY_COUNT_OVER: { code: 50075, simStr: '购买次数不足' },
|
||||
|
||||
// GM后台相关状态 60000 - 69999
|
||||
GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' },
|
||||
|
||||
64
shared/db/ActivityEntertainRec.ts
Normal file
64
shared/db/ActivityEntertainRec.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
|
||||
/**
|
||||
* 宴请百家
|
||||
*/
|
||||
class EntertainRecord {
|
||||
@prop({ required: true })
|
||||
todayIndex: number; // 第几天
|
||||
|
||||
@prop({ required: true })
|
||||
id: number; // 唯一id
|
||||
|
||||
@prop({ required: true })
|
||||
hid: number; // 冗余,武将id
|
||||
|
||||
@prop({ required: true })
|
||||
reward: string; // 冗余,奖励
|
||||
|
||||
@prop({ required: true })
|
||||
time: Date; // 时间
|
||||
}
|
||||
|
||||
@index({ roleId: 1, activityId: 1 })
|
||||
|
||||
export default class Activity_Entertain_Rec extends BaseModel {
|
||||
@prop({ required: true })
|
||||
serverId: number; // 服Id
|
||||
|
||||
@prop({ required: true })
|
||||
activityId: number; // 活动Id
|
||||
|
||||
@prop({ required: true })
|
||||
roundIndex: number; // 第几轮
|
||||
|
||||
@prop({ required: true })
|
||||
roleId: string; // 用户Id
|
||||
|
||||
@prop({ required: true })
|
||||
buyCnt: number; // 购买次数
|
||||
|
||||
@prop({ required: true, type: EntertainRecord, _id: false })
|
||||
record: EntertainRecord[]; // 宴请记录
|
||||
|
||||
public static async findData(serverId: number, activityId: number, roundIndex: number, roleId: string) {
|
||||
let result: ActivityEntertainRecModelType = await ActivityEntertainRecModel.findOne({ serverId, roleId, activityId, roundIndex }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async record(serverId: number, activityId: number, roundIndex: number, roleId: string, record: EntertainRecord) {
|
||||
let result: ActivityEntertainRecModelType = await ActivityEntertainRecModel.findOneAndUpdate({ serverId, roleId, activityId, roundIndex }, { $push: { record }, $setOnInsert: { buyCnt: 0 } }, { new: true, upsert: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async buyCnt(serverId: number, activityId: number, roundIndex: number, roleId: string, count: number) {
|
||||
let result: ActivityEntertainRecModelType = await ActivityEntertainRecModel.findOneAndUpdate({ serverId, roleId, activityId, roundIndex }, { $inc: { buyCnt: count }, $setOnInsert: { record: [] } }, { new: true, upsert: true }).lean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const ActivityEntertainRecModel = getModelForClass(Activity_Entertain_Rec);
|
||||
|
||||
export interface ActivityEntertainRecModelType extends Pick<DocumentType<Activity_Entertain_Rec>, keyof Activity_Entertain_Rec> { }
|
||||
export type ActivityEntertainRecModelTypeParam = Partial<ActivityEntertainRecModelType>; // 将所有字段变成可选项
|
||||
@@ -4,7 +4,7 @@ import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoos
|
||||
/**
|
||||
* 自增 ID
|
||||
*/
|
||||
@index({ sourceType: 1, time: 1, id: 1 })
|
||||
@index({ beginTime: 1, id: 1 })
|
||||
export default class CounterLots extends BaseModel {
|
||||
|
||||
@prop({ required: true })
|
||||
|
||||
@@ -17,6 +17,7 @@ export abstract class ActivityBase {
|
||||
hideDayByServer: number = 0;
|
||||
isEnable: boolean = false;
|
||||
interval: number = 0;
|
||||
beginWithoutHideTime: number = 0;
|
||||
|
||||
roundIndex: number = 0;//周期活动第几个周期,从1开始
|
||||
nextRefreshTime: number = 0;//周期活动下次刷新时间
|
||||
@@ -126,8 +127,14 @@ export abstract class ActivityBase {
|
||||
}
|
||||
}
|
||||
if(activityData.hideDayByServer > 0) {
|
||||
this.beginWithoutHideTime = this.beginTime;
|
||||
let hidOverTime = moment(serverTime * 1000).add(activityData.hideDayByServer, 'd').startOf('d').add(REFRESH_TIME, 'h').valueOf();
|
||||
if(this.beginTime < hidOverTime) this.beginTime = hidOverTime;
|
||||
|
||||
if(activityData.timeType != ACTIVITY_TIME_TYPE.MULT_DATE_TIME) {
|
||||
let startOfBeginDay = moment(this.beginTime).startOf('d').add(REFRESH_TIME, 'h');
|
||||
this.todayIndex = deltaDays(startOfBeginDay.toDate(), new Date) + 1;
|
||||
}
|
||||
}
|
||||
// console.log('活动时间数据...', '活动id:', activityData.activityId, '类型:', activityData.timeType, '开始时间:', this.beginTime, moment(this.beginTime).toDate(),
|
||||
// '结束:', this.endTime, moment(this.endTime).toDate(),
|
||||
|
||||
175
shared/domain/activityField/entertainField.ts
Normal file
175
shared/domain/activityField/entertainField.ts
Normal file
@@ -0,0 +1,175 @@
|
||||
// 节日活动 - 划龙舟
|
||||
import { ActivityModelType } from '../../db/Activity';
|
||||
import { ActivityEntertainRecModelType } from '../../db/ActivityEntertainRec';
|
||||
// import { ActivityEntertainRecModelType } from '../../db/ActivityEntertainRec';
|
||||
import { ActivityBase } from './activityField';
|
||||
|
||||
// 后台格式
|
||||
interface HeroNumInDb {
|
||||
id: number;// 第几次拜访
|
||||
reward: string; // 奖励,type&id&count
|
||||
}
|
||||
|
||||
interface HeroInDb {
|
||||
id: number // 编号
|
||||
index: number; // 位置
|
||||
name: string; // 名字
|
||||
imageName: string; // 图片
|
||||
condition: string; // 解锁条件,type1:宴请x名武将,type2:宴请某个人
|
||||
hid: number; // 武将id
|
||||
num: HeroNumInDb[]; // 第几次的奖励是什么
|
||||
}
|
||||
|
||||
interface EntertainDataInDb {
|
||||
buyCost: string; // 购买一次宴请次数的消耗,type&id&count
|
||||
dailyBuyCnt: number; // 每天可以购买的次数
|
||||
freeCnt: number; // 每天可以免费划船的次数
|
||||
heroes: HeroInDb[]; // 可以宴请的武将的次数
|
||||
}
|
||||
|
||||
class HeroData {
|
||||
id: number; // 编号
|
||||
index: number; // 位置
|
||||
name: string; // 名字
|
||||
imageName: string; // 图片
|
||||
condition: string; // 解锁条件,type1:宴请x名武将;type2:宴请某个人
|
||||
conditionArr: {type: number, param: number}[] = [];
|
||||
hid: number; // 武将id
|
||||
numArr: HeroNumInDb[] = []; // 第几次能获得什么奖励
|
||||
|
||||
maxNum: number = 0; // 最大次数
|
||||
num: number = 0; // 玩家当前第几次拜访
|
||||
reward: string = '&'; // 玩家下一次可以获得的奖励
|
||||
|
||||
constructor(data: HeroInDb) {
|
||||
this.id = data.id;
|
||||
this.index = data.index;
|
||||
this.name = data.name;
|
||||
this.imageName = data.imageName;
|
||||
this.condition = data.condition;
|
||||
let arr = data.condition.split('|');
|
||||
for(let str of arr) {
|
||||
let obj = str?.split('&')||[];
|
||||
if(obj[0]) this.conditionArr.push({ type: parseInt(obj[0]), param: parseInt(obj[1]) });
|
||||
}
|
||||
this.hid = data.hid;
|
||||
this.numArr = data.num;
|
||||
this.maxNum = data.num.length;
|
||||
this.calReward();
|
||||
}
|
||||
|
||||
public incNum() {
|
||||
this.num++;
|
||||
this.calReward();
|
||||
}
|
||||
|
||||
public calReward() {
|
||||
// console.log('####', this.numArr, this.num)
|
||||
let nextReward = this.numArr.find(cur => cur.id == this.num + 1);
|
||||
this.reward = nextReward?.reward||'&';
|
||||
}
|
||||
|
||||
public getShowResult() {
|
||||
let { id, index, name, imageName, condition, hid, maxNum, num, reward } = this;
|
||||
return { id, index, name, imageName, condition, hid, maxNum, num, reward }
|
||||
}
|
||||
}
|
||||
|
||||
export class EntertainData extends ActivityBase {
|
||||
buyCost: string; // 购买一次划船次数的消耗,type&id&count
|
||||
dailyBuyCnt: number; // 每天可以购买的次数
|
||||
freeCnt: number; // 每天可以免费划船的次数
|
||||
heroes: HeroData[] = []; // 宴请武将
|
||||
|
||||
maxBuyCnt: number = 0; // 累积到现在可以购买的次数
|
||||
buyCnt: number = 0; // 累积到现在已经购买了的次数
|
||||
todayPlayCnt: number = 0; // 今天玩的次数
|
||||
playCnt: number = 0; // 总计玩的次数
|
||||
|
||||
invitedHeroNum: number = 0; // 宴请了的武将的数量
|
||||
invitedHids: number[] = []; // 宴请了的武将的位置
|
||||
|
||||
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
|
||||
super(activityData, createTime, serverTime)
|
||||
this.initData(activityData.data)
|
||||
}
|
||||
|
||||
public initData(data: string): void {
|
||||
let dataObj: EntertainDataInDb = JSON.parse(data);
|
||||
if (!dataObj) return;
|
||||
|
||||
this.buyCost = dataObj.buyCost || '&';
|
||||
this.dailyBuyCnt = dataObj.dailyBuyCnt || 0;
|
||||
this.freeCnt = dataObj.freeCnt || 0;
|
||||
this.maxBuyCnt = this.todayIndex * this.dailyBuyCnt;
|
||||
for (let data of (dataObj.heroes || [])) {
|
||||
this.heroes.push(new HeroData(data));
|
||||
}
|
||||
}
|
||||
|
||||
public findHeroById(id: number) {
|
||||
let hero = this.heroes.find(cur => cur.id == id);
|
||||
return hero;
|
||||
}
|
||||
|
||||
public setPlayerRecords(playerData: ActivityEntertainRecModelType) {
|
||||
if (!playerData) return;
|
||||
this.buyCnt = playerData.buyCnt || 0;
|
||||
this.todayPlayCnt = 0;
|
||||
this.playCnt = 0;
|
||||
let recByDay = new Map<number, number>();
|
||||
for (let { id, hid, todayIndex } of (playerData.record || [])) {
|
||||
if (todayIndex == this.todayIndex) {
|
||||
this.todayPlayCnt++;
|
||||
this.playCnt++;
|
||||
} else {
|
||||
let n = recByDay.get(todayIndex) || 0;
|
||||
if (n >= this.freeCnt) { // 不包含之前免费玩的次数
|
||||
this.playCnt++;
|
||||
}
|
||||
recByDay.set(todayIndex, n + 1);
|
||||
}
|
||||
|
||||
let hero = this.findHeroById(id);
|
||||
hero.incNum();
|
||||
if(this.invitedHids.indexOf(hid) == -1) {
|
||||
this.invitedHids.push(hid);
|
||||
this.invitedHeroNum++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public updateBuyCnt(playerData: ActivityEntertainRecModelType) {
|
||||
if (!playerData) return;
|
||||
this.buyCnt = playerData.buyCnt || 0;
|
||||
this.todayPlayCnt = 0;
|
||||
this.playCnt = 0;
|
||||
let recByDay = new Map<number, number>();
|
||||
for (let { todayIndex } of (playerData.record || [])) {
|
||||
if (todayIndex == this.todayIndex) {
|
||||
this.todayPlayCnt++;
|
||||
this.playCnt++;
|
||||
} else {
|
||||
let n = recByDay.get(todayIndex) || 0;
|
||||
if (n >= this.freeCnt) { // 不包含之前免费玩的次数
|
||||
this.playCnt++;
|
||||
}
|
||||
recByDay.set(todayIndex, n + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public getShowResult() {
|
||||
return {
|
||||
...this.getBaseKeys(),
|
||||
buyCost: this.buyCost,
|
||||
dailyBuyCnt: this.dailyBuyCnt,
|
||||
freeCnt: this.freeCnt,
|
||||
maxBuyCnt: this.maxBuyCnt,
|
||||
buyCnt: this.buyCnt,
|
||||
todayPlayCnt: this.todayPlayCnt,
|
||||
playCnt: this.playCnt,
|
||||
heroes: this.heroes.map(route => route.getShowResult()),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -121,7 +121,8 @@ export class GrowthFundData extends ActivityBase {
|
||||
|
||||
//是否领取过
|
||||
public isReceive(pageIndex: number, cellIndex: number) {
|
||||
let index = this.receiveRecords.findIndex(obj => { obj && obj.pageIndex == pageIndex && cellIndex == obj.cellIndex })
|
||||
let index = this.receiveRecords.findIndex(obj => { return obj && obj.pageIndex == pageIndex && cellIndex == obj.cellIndex })
|
||||
|
||||
return (index !== -1);
|
||||
}
|
||||
|
||||
@@ -130,7 +131,7 @@ export class GrowthFundData extends ActivityBase {
|
||||
for (let i = 0; i < this.list.length; i++) {
|
||||
let page = this.list[i];
|
||||
for (let item of page.items) {
|
||||
let index = this.receiveRecords.findIndex(obj => { obj && obj.pageIndex == page.pageIndex && item.cellIndex == obj.cellIndex })
|
||||
let index = this.receiveRecords.findIndex(obj => { return obj && obj.pageIndex == page.pageIndex && item.cellIndex == obj.cellIndex })
|
||||
if (index == -1) {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ export class NewHeroGKData extends ActivityBase {
|
||||
let dataObj: NewHeroGkDataInDb = JSON.parse(data);
|
||||
let arr = dataObj.wars||[];
|
||||
for (let obj of arr) {
|
||||
this.wars.push(new NewHeroGachaWar(obj, this.beginTime))
|
||||
this.wars.push(new NewHeroGachaWar(obj, this.beginWithoutHideTime||this.beginTime))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// 天晶石表
|
||||
import { readFileAndParse, parseGoodStr, parseNumberList } from '../util'
|
||||
import { readFileAndParse, parseGoodStr, parseNumberList, decodeArrayListStr } from '../util'
|
||||
import { FILENAME } from '../../consts';
|
||||
import { RewardInter } from '../interface';
|
||||
|
||||
@@ -22,6 +22,8 @@ export interface DicJewel {
|
||||
readonly randomEffect: number[];
|
||||
// 稀有属性
|
||||
readonly rareEffect: number[];
|
||||
// 基础属性
|
||||
readonly rareEffectBaseAttr: {id: number, num: number}[];
|
||||
// 对应藏宝图id
|
||||
readonly mapGoodId: number;
|
||||
// 淬炼消耗
|
||||
@@ -43,8 +45,10 @@ export function loadJewel() {
|
||||
arr.forEach(o => {
|
||||
o.randomEffect = parseNumberList(o.randomEffect);
|
||||
o.rareEffect = parseNumberList(o.rareEffect);
|
||||
o.rareEffectBaseAttr = parseAttr(o.rareEffectBaseAttr);
|
||||
o.quenchConsume = parseGoodStr(o.quenchConsume);
|
||||
o.inheritConsume = parseGoodStr(o.inheritConsume);
|
||||
|
||||
dicJewel.set(o.good_id, o);
|
||||
dicBlueprt.set(o.mapGoodId, o.good_id);
|
||||
if(!dicBlueprtByLv.has(o.lv)) {
|
||||
@@ -53,4 +57,17 @@ export function loadJewel() {
|
||||
dicBlueprtByLv.get(o.lv).push(o.mapGoodId);
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
function parseAttr(str: string) {
|
||||
let result = new Array<{id: number, num: number}>();
|
||||
if(!str) return result;
|
||||
let decodeArr = decodeArrayListStr(str);
|
||||
for(let [id, num] of decodeArr) {
|
||||
if(isNaN(parseInt(id)) || isNaN(parseInt(num))) {
|
||||
throw new Error('data table format wrong');
|
||||
}
|
||||
result.push({id: parseInt(id), num: parseInt(num)});
|
||||
}
|
||||
return result
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -304,5 +304,11 @@
|
||||
"activityType": 55,
|
||||
"name": "DRAGON_BOAT",
|
||||
"string": "龙舟"
|
||||
},
|
||||
{
|
||||
"id": 56,
|
||||
"activityType": 56,
|
||||
"name": "ENTERTAIN",
|
||||
"string": "宴请百家"
|
||||
}
|
||||
]
|
||||
@@ -1234,7 +1234,7 @@
|
||||
{
|
||||
"id": 210102,
|
||||
"skillType": 3,
|
||||
"newId": "2130201011&",
|
||||
"newId": "2230201011&",
|
||||
"insteadId": "&",
|
||||
"artifactName": "虎头湛金枪",
|
||||
"quality": 2,
|
||||
@@ -1267,7 +1267,7 @@
|
||||
{
|
||||
"id": 210105,
|
||||
"skillType": 3,
|
||||
"newId": "2130501011&",
|
||||
"newId": "2230501011&",
|
||||
"insteadId": "&",
|
||||
"artifactName": "虎头湛金枪",
|
||||
"quality": 5,
|
||||
@@ -1460,7 +1460,7 @@
|
||||
"quality": 2,
|
||||
"jobClass": 0,
|
||||
"hids": "&",
|
||||
"info": "生命、攻击、物防、策防+5%"
|
||||
"info": "生命、攻击、物防、策防+10%"
|
||||
},
|
||||
{
|
||||
"id": 250103,
|
||||
|
||||
@@ -417,14 +417,14 @@
|
||||
"des": "专属宝物自选箱",
|
||||
"type": 2,
|
||||
"count": 1,
|
||||
"reward": "2&83001&1|2&83101&1|2&83201&1|2&83901&1"
|
||||
"reward": "2&83001&1|2&83101&1|2&83201&1|2&83901&1|2&83501&1|2&83601&1|2&83701&1|2&84001&1"
|
||||
},
|
||||
{
|
||||
"id": 61,
|
||||
"des": "上品专属宝物箱",
|
||||
"type": 3,
|
||||
"count": 1,
|
||||
"reward": "2&82101&1|2&82102&1|2&82103&1|2&82106&1|2&82121&1|2&82122&1|2&82123&1|2&82126&1|2&82201&1|2&82202&1|2&82203&1|2&82206&1|2&82221&1|2&82222&1|2&82223&1|2&82226&1|2&82301&1|2&82302&1|2&82303&1|2&82306&1|2&82321&1|2&82322&1|2&82323&1|2&82326&1|2&82401&1|2&82402&1|2&82403&1|2&82406&1|2&82421&1|2&82422&1|2&82423&1|2&82426&1|2&82501&1|2&82502&1|2&82503&1|2&82506&1|2&82521&1|2&82522&1|2&82523&1|2&82526&1|2&82601&1|2&82602&1|2&82603&1|2&82606&1|2&82621&1|2&82622&1|2&82623&1|2&82626&1|2&82701&1|2&82702&1|2&82703&1|2&82706&1|2&82721&1|2&82722&1|2&82723&1|2&82726&1|2&83001&1|2&83101&1|2&83201&1|2&83901&1"
|
||||
"reward": "2&82101&1|2&82102&1|2&82103&1|2&82106&1|2&82121&1|2&82122&1|2&82123&1|2&82126&1|2&82201&1|2&82202&1|2&82203&1|2&82206&1|2&82221&1|2&82222&1|2&82223&1|2&82226&1|2&82301&1|2&82302&1|2&82303&1|2&82306&1|2&82321&1|2&82322&1|2&82323&1|2&82326&1|2&82401&1|2&82402&1|2&82403&1|2&82406&1|2&82421&1|2&82422&1|2&82423&1|2&82426&1|2&82501&1|2&82502&1|2&82503&1|2&82506&1|2&82521&1|2&82522&1|2&82523&1|2&82526&1|2&82601&1|2&82602&1|2&82603&1|2&82606&1|2&82621&1|2&82622&1|2&82623&1|2&82626&1|2&82701&1|2&82702&1|2&82703&1|2&82706&1|2&82721&1|2&82722&1|2&82723&1|2&82726&1|2&83001&1|2&83101&1|2&83201&1|2&83901&1|2&83501&1|2&83601&1|2&83701&1|2&84001&1"
|
||||
},
|
||||
{
|
||||
"id": 62,
|
||||
|
||||
@@ -12669,13 +12669,53 @@
|
||||
"floor": 0,
|
||||
"备注": "落英天香弓"
|
||||
},
|
||||
{
|
||||
"id": 60005,
|
||||
"giftPackageId": 60,
|
||||
"contentType": 2,
|
||||
"content": 83501,
|
||||
"count": 1,
|
||||
"weight": 1,
|
||||
"floor": 0,
|
||||
"备注": "恶来铁戟"
|
||||
},
|
||||
{
|
||||
"id": 60006,
|
||||
"giftPackageId": 60,
|
||||
"contentType": 2,
|
||||
"content": 83601,
|
||||
"count": 1,
|
||||
"weight": 1,
|
||||
"floor": 0,
|
||||
"备注": "青龙偃月刀"
|
||||
},
|
||||
{
|
||||
"id": 60007,
|
||||
"giftPackageId": 60,
|
||||
"contentType": 2,
|
||||
"content": 83701,
|
||||
"count": 1,
|
||||
"weight": 1,
|
||||
"floor": 0,
|
||||
"备注": "霸王枪"
|
||||
},
|
||||
{
|
||||
"id": 60008,
|
||||
"giftPackageId": 60,
|
||||
"contentType": 2,
|
||||
"content": 84001,
|
||||
"count": 1,
|
||||
"weight": 1,
|
||||
"floor": 0,
|
||||
"备注": "软香绫"
|
||||
},
|
||||
{
|
||||
"id": 61001,
|
||||
"giftPackageId": 61,
|
||||
"contentType": 2,
|
||||
"content": 82101,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色尚方剑"
|
||||
},
|
||||
@@ -12685,7 +12725,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82121,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色握奇经"
|
||||
},
|
||||
@@ -12695,7 +12735,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82201,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色黄钺斧"
|
||||
},
|
||||
@@ -12705,7 +12745,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82221,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色断魂枪"
|
||||
},
|
||||
@@ -12715,7 +12755,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82301,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色穿龙槊"
|
||||
},
|
||||
@@ -12725,7 +12765,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82321,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色铁甲马"
|
||||
},
|
||||
@@ -12735,7 +12775,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82401,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色龙雀刀"
|
||||
},
|
||||
@@ -12745,7 +12785,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82421,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色吞云盾"
|
||||
},
|
||||
@@ -12755,7 +12795,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82501,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色神臂弓"
|
||||
},
|
||||
@@ -12765,7 +12805,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82521,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色镇天箭"
|
||||
},
|
||||
@@ -12775,7 +12815,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82601,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色博浪锥"
|
||||
},
|
||||
@@ -12785,7 +12825,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82621,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色鱼肠剑"
|
||||
},
|
||||
@@ -12795,7 +12835,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82701,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色神木鼎"
|
||||
},
|
||||
@@ -12805,7 +12845,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82721,
|
||||
"count": 1,
|
||||
"weight": 224,
|
||||
"weight": 448,
|
||||
"floor": 0,
|
||||
"备注": "蓝色太平要术"
|
||||
},
|
||||
@@ -12815,7 +12855,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82102,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色尚方剑"
|
||||
},
|
||||
@@ -12825,7 +12865,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82122,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色握奇经"
|
||||
},
|
||||
@@ -12835,7 +12875,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82202,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色黄钺斧"
|
||||
},
|
||||
@@ -12845,7 +12885,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82222,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色断魂枪"
|
||||
},
|
||||
@@ -12855,7 +12895,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82302,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色穿龙槊"
|
||||
},
|
||||
@@ -12865,7 +12905,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82322,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色铁甲马"
|
||||
},
|
||||
@@ -12875,7 +12915,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82402,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色龙雀刀"
|
||||
},
|
||||
@@ -12885,7 +12925,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82422,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色吞云盾"
|
||||
},
|
||||
@@ -12895,7 +12935,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82502,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色神臂弓"
|
||||
},
|
||||
@@ -12905,7 +12945,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82522,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色镇天箭"
|
||||
},
|
||||
@@ -12915,7 +12955,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82602,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色博浪锥"
|
||||
},
|
||||
@@ -12925,7 +12965,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82622,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色鱼肠剑"
|
||||
},
|
||||
@@ -12935,7 +12975,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82702,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色神木鼎"
|
||||
},
|
||||
@@ -12945,7 +12985,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82722,
|
||||
"count": 1,
|
||||
"weight": 164,
|
||||
"weight": 328,
|
||||
"floor": 0,
|
||||
"备注": "紫色太平要术"
|
||||
},
|
||||
@@ -12955,7 +12995,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82103,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色尚方剑"
|
||||
},
|
||||
@@ -12965,7 +13005,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82123,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色握奇经"
|
||||
},
|
||||
@@ -12975,7 +13015,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82203,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色黄钺斧"
|
||||
},
|
||||
@@ -12985,7 +13025,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82223,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色断魂枪"
|
||||
},
|
||||
@@ -12995,7 +13035,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82303,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色穿龙槊"
|
||||
},
|
||||
@@ -13005,7 +13045,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82323,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色铁甲马"
|
||||
},
|
||||
@@ -13015,7 +13055,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82403,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色龙雀刀"
|
||||
},
|
||||
@@ -13025,7 +13065,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82423,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色吞云盾"
|
||||
},
|
||||
@@ -13035,7 +13075,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82503,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色神臂弓"
|
||||
},
|
||||
@@ -13045,7 +13085,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82523,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色镇天箭"
|
||||
},
|
||||
@@ -13055,7 +13095,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82603,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色博浪锥"
|
||||
},
|
||||
@@ -13065,7 +13105,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82623,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色鱼肠剑"
|
||||
},
|
||||
@@ -13075,7 +13115,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82703,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色神木鼎"
|
||||
},
|
||||
@@ -13085,7 +13125,7 @@
|
||||
"contentType": 2,
|
||||
"content": 82723,
|
||||
"count": 1,
|
||||
"weight": 10,
|
||||
"weight": 20,
|
||||
"floor": 1,
|
||||
"备注": "橙色太平要术"
|
||||
},
|
||||
@@ -13129,6 +13169,46 @@
|
||||
"floor": 2,
|
||||
"备注": "落英天香弓"
|
||||
},
|
||||
{
|
||||
"id": 61047,
|
||||
"giftPackageId": 61,
|
||||
"contentType": 2,
|
||||
"content": 83501,
|
||||
"count": 1,
|
||||
"weight": 7,
|
||||
"floor": 2,
|
||||
"备注": "恶来铁戟"
|
||||
},
|
||||
{
|
||||
"id": 61048,
|
||||
"giftPackageId": 61,
|
||||
"contentType": 2,
|
||||
"content": 83601,
|
||||
"count": 1,
|
||||
"weight": 7,
|
||||
"floor": 2,
|
||||
"备注": "青龙偃月刀"
|
||||
},
|
||||
{
|
||||
"id": 61049,
|
||||
"giftPackageId": 61,
|
||||
"contentType": 2,
|
||||
"content": 83701,
|
||||
"count": 1,
|
||||
"weight": 7,
|
||||
"floor": 2,
|
||||
"备注": "霸王枪"
|
||||
},
|
||||
{
|
||||
"id": 61050,
|
||||
"giftPackageId": 61,
|
||||
"contentType": 2,
|
||||
"content": 84001,
|
||||
"count": 1,
|
||||
"weight": 7,
|
||||
"floor": 2,
|
||||
"备注": "软香绫"
|
||||
},
|
||||
{
|
||||
"id": 62001,
|
||||
"giftPackageId": 62,
|
||||
@@ -15827,7 +15907,7 @@
|
||||
"count": 1,
|
||||
"weight": 14,
|
||||
"floor": 2,
|
||||
"备注": "郭嘉/诸葛亮/周瑜/孙尚香专属宝物自选箱"
|
||||
"备注": "郭嘉/诸葛亮/周瑜/孙尚香/典韦/关羽/孙策/貂蝉专属宝物自选箱"
|
||||
},
|
||||
{
|
||||
"id": 71001,
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"effectCount": 1,
|
||||
"randomEffect": "90401&90601&90901&91101&91201&91301&91601&91701",
|
||||
"rareEffect": "90110&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33001,
|
||||
"quenchConsume": "17057&2",
|
||||
"successConsume": "17057&100",
|
||||
@@ -27,6 +28,7 @@
|
||||
"effectCount": 1,
|
||||
"randomEffect": "90402&90602&90902&91102&91202&91302&91602&91702",
|
||||
"rareEffect": "90111&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33002,
|
||||
"quenchConsume": "17057&4",
|
||||
"successConsume": "17057&100",
|
||||
@@ -44,6 +46,7 @@
|
||||
"effectCount": 2,
|
||||
"randomEffect": "90403&90603&90903&91103&91203&91303&91603&91703",
|
||||
"rareEffect": "90112&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33003,
|
||||
"quenchConsume": "17057&6",
|
||||
"successConsume": "17057&100",
|
||||
@@ -61,6 +64,7 @@
|
||||
"effectCount": 2,
|
||||
"randomEffect": "90404&90604&90904&91104&91204&91304&91604&91704",
|
||||
"rareEffect": "90113&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33004,
|
||||
"quenchConsume": "17057&8",
|
||||
"successConsume": "17057&100",
|
||||
@@ -78,6 +82,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90405&90605&90905&91105&91205&91305&91605&91705",
|
||||
"rareEffect": "90114&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33005,
|
||||
"quenchConsume": "17057&12",
|
||||
"successConsume": "17057&100",
|
||||
@@ -95,6 +100,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90406&90606&90906&91106&91206&91306&91606&91706",
|
||||
"rareEffect": "90115&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33006,
|
||||
"quenchConsume": "17057&16",
|
||||
"successConsume": "17057&100",
|
||||
@@ -112,6 +118,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90407&90607&90907&91107&91207&91307&91607&91707",
|
||||
"rareEffect": "90116&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33007,
|
||||
"quenchConsume": "17057&20",
|
||||
"successConsume": "17057&100",
|
||||
@@ -129,6 +136,7 @@
|
||||
"effectCount": 4,
|
||||
"randomEffect": "90408&90608&90908&91108&91208&91308&91608&91708",
|
||||
"rareEffect": "90117&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33008,
|
||||
"quenchConsume": "17057&24",
|
||||
"successConsume": "17057&100",
|
||||
@@ -146,6 +154,7 @@
|
||||
"effectCount": 4,
|
||||
"randomEffect": "90409&90609&90909&91109&91209&91309&91609&91709",
|
||||
"rareEffect": "90118&",
|
||||
"rareEffectBaseAttr": "2&50000",
|
||||
"mapGoodId": 0,
|
||||
"quenchConsume": "17057&30",
|
||||
"successConsume": "17057&100",
|
||||
@@ -163,6 +172,7 @@
|
||||
"effectCount": 1,
|
||||
"randomEffect": "90401&90601&90801&91001&90901&91101&91401&91601",
|
||||
"rareEffect": "90210&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33010,
|
||||
"quenchConsume": "17057&2",
|
||||
"successConsume": "17057&100",
|
||||
@@ -180,6 +190,7 @@
|
||||
"effectCount": 1,
|
||||
"randomEffect": "90402&90602&90802&91002&90902&91102&91402&91602",
|
||||
"rareEffect": "90211&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33011,
|
||||
"quenchConsume": "17057&4",
|
||||
"successConsume": "17057&100",
|
||||
@@ -197,6 +208,7 @@
|
||||
"effectCount": 2,
|
||||
"randomEffect": "90403&90603&90803&91003&90903&91103&91403&91603",
|
||||
"rareEffect": "90212&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33012,
|
||||
"quenchConsume": "17057&6",
|
||||
"successConsume": "17057&100",
|
||||
@@ -214,6 +226,7 @@
|
||||
"effectCount": 2,
|
||||
"randomEffect": "90404&90604&90804&91004&90904&91104&91404&91604",
|
||||
"rareEffect": "90213&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33013,
|
||||
"quenchConsume": "17057&8",
|
||||
"successConsume": "17057&100",
|
||||
@@ -231,6 +244,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90405&90605&90805&91005&90905&91105&91405&91605",
|
||||
"rareEffect": "90214&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33014,
|
||||
"quenchConsume": "17057&12",
|
||||
"successConsume": "17057&100",
|
||||
@@ -248,6 +262,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90406&90606&90806&91006&90906&91106&91406&91606",
|
||||
"rareEffect": "90215&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33015,
|
||||
"quenchConsume": "17057&16",
|
||||
"successConsume": "17057&100",
|
||||
@@ -265,6 +280,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90407&90607&90807&91007&90907&91107&91407&91607",
|
||||
"rareEffect": "90216&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33016,
|
||||
"quenchConsume": "17057&20",
|
||||
"successConsume": "17057&100",
|
||||
@@ -282,6 +298,7 @@
|
||||
"effectCount": 4,
|
||||
"randomEffect": "90408&90608&90808&91008&90908&91108&91408&91608",
|
||||
"rareEffect": "90217&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33017,
|
||||
"quenchConsume": "17057&24",
|
||||
"successConsume": "17057&100",
|
||||
@@ -299,6 +316,7 @@
|
||||
"effectCount": 4,
|
||||
"randomEffect": "90409&90609&90809&91009&90909&91109&91409&91609",
|
||||
"rareEffect": "90218&",
|
||||
"rareEffectBaseAttr": "4&50000",
|
||||
"mapGoodId": 0,
|
||||
"quenchConsume": "17057&30",
|
||||
"successConsume": "17057&100",
|
||||
@@ -316,6 +334,7 @@
|
||||
"effectCount": 1,
|
||||
"randomEffect": "90401&90601&90801&91001&90901&91101&91201&91501",
|
||||
"rareEffect": "90310&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33019,
|
||||
"quenchConsume": "17057&2",
|
||||
"successConsume": "17057&100",
|
||||
@@ -333,6 +352,7 @@
|
||||
"effectCount": 1,
|
||||
"randomEffect": "90402&90602&90802&91002&90902&91102&91202&91502",
|
||||
"rareEffect": "90311&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33020,
|
||||
"quenchConsume": "17057&4",
|
||||
"successConsume": "17057&100",
|
||||
@@ -350,6 +370,7 @@
|
||||
"effectCount": 2,
|
||||
"randomEffect": "90403&90603&90803&91003&90903&91103&91203&91503",
|
||||
"rareEffect": "90312&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33021,
|
||||
"quenchConsume": "17057&6",
|
||||
"successConsume": "17057&100",
|
||||
@@ -367,6 +388,7 @@
|
||||
"effectCount": 2,
|
||||
"randomEffect": "90404&90604&90804&91004&90904&91104&91204&91504",
|
||||
"rareEffect": "90313&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33022,
|
||||
"quenchConsume": "17057&8",
|
||||
"successConsume": "17057&100",
|
||||
@@ -384,6 +406,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90405&90605&90805&91005&90905&91105&91205&91505",
|
||||
"rareEffect": "90314&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33023,
|
||||
"quenchConsume": "17057&12",
|
||||
"successConsume": "17057&100",
|
||||
@@ -401,6 +424,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90406&90606&90806&91006&90906&91106&91206&91506",
|
||||
"rareEffect": "90315&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33024,
|
||||
"quenchConsume": "17057&16",
|
||||
"successConsume": "17057&100",
|
||||
@@ -418,6 +442,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90407&90607&90807&91007&90907&91107&91207&91507",
|
||||
"rareEffect": "90316&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33025,
|
||||
"quenchConsume": "17057&20",
|
||||
"successConsume": "17057&100",
|
||||
@@ -435,6 +460,7 @@
|
||||
"effectCount": 4,
|
||||
"randomEffect": "90408&90608&90808&91008&90908&91108&91208&91508",
|
||||
"rareEffect": "90317&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33026,
|
||||
"quenchConsume": "17057&24",
|
||||
"successConsume": "17057&100",
|
||||
@@ -452,6 +478,7 @@
|
||||
"effectCount": 4,
|
||||
"randomEffect": "90409&90609&90809&91009&90909&91109&91209&91509",
|
||||
"rareEffect": "90318&",
|
||||
"rareEffectBaseAttr": "5&50000",
|
||||
"mapGoodId": 0,
|
||||
"quenchConsume": "17057&30",
|
||||
"successConsume": "17057&100",
|
||||
@@ -469,6 +496,7 @@
|
||||
"effectCount": 1,
|
||||
"randomEffect": "90501&90701&90901&91101&91301&91401&91501&91701",
|
||||
"rareEffect": "90010&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33028,
|
||||
"quenchConsume": "17057&2",
|
||||
"successConsume": "17057&100",
|
||||
@@ -486,6 +514,7 @@
|
||||
"effectCount": 1,
|
||||
"randomEffect": "90502&90702&90902&91102&91302&91402&91502&91702",
|
||||
"rareEffect": "90011&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33029,
|
||||
"quenchConsume": "17057&4",
|
||||
"successConsume": "17057&100",
|
||||
@@ -503,6 +532,7 @@
|
||||
"effectCount": 2,
|
||||
"randomEffect": "90503&90703&90903&91103&91303&91403&91503&91703",
|
||||
"rareEffect": "90012&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33030,
|
||||
"quenchConsume": "17057&6",
|
||||
"successConsume": "17057&100",
|
||||
@@ -520,6 +550,7 @@
|
||||
"effectCount": 2,
|
||||
"randomEffect": "90504&90704&90904&91104&91304&91404&91504&91704",
|
||||
"rareEffect": "90013&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33031,
|
||||
"quenchConsume": "17057&8",
|
||||
"successConsume": "17057&100",
|
||||
@@ -537,6 +568,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90505&90705&90905&91105&91305&91405&91505&91705",
|
||||
"rareEffect": "90014&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33032,
|
||||
"quenchConsume": "17057&12",
|
||||
"successConsume": "17057&100",
|
||||
@@ -554,6 +586,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90506&90706&90906&91106&91306&91406&91506&91706",
|
||||
"rareEffect": "90015&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33033,
|
||||
"quenchConsume": "17057&16",
|
||||
"successConsume": "17057&100",
|
||||
@@ -571,6 +604,7 @@
|
||||
"effectCount": 3,
|
||||
"randomEffect": "90507&90707&90907&91107&91307&91407&91507&91707",
|
||||
"rareEffect": "90016&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33034,
|
||||
"quenchConsume": "17057&20",
|
||||
"successConsume": "17057&100",
|
||||
@@ -588,6 +622,7 @@
|
||||
"effectCount": 4,
|
||||
"randomEffect": "90508&90708&90908&91108&91308&91408&91508&91708",
|
||||
"rareEffect": "90017&",
|
||||
"rareEffectBaseAttr": "&",
|
||||
"mapGoodId": 33035,
|
||||
"quenchConsume": "17057&24",
|
||||
"successConsume": "17057&100",
|
||||
@@ -605,6 +640,7 @@
|
||||
"effectCount": 4,
|
||||
"randomEffect": "90509&90709&90909&91109&91309&91409&91509&91709",
|
||||
"rareEffect": "90018&",
|
||||
"rareEffectBaseAttr": "1&160000",
|
||||
"mapGoodId": 0,
|
||||
"quenchConsume": "17057&30",
|
||||
"successConsume": "17057&100",
|
||||
|
||||
@@ -512,6 +512,82 @@
|
||||
"vipPurchaseLimit": 0,
|
||||
"seasonNum": 0
|
||||
},
|
||||
{
|
||||
"id": 2206,
|
||||
"goodId": 83501,
|
||||
"goodName": "恶来铁戟",
|
||||
"num": 1,
|
||||
"shop": 2,
|
||||
"type": 21,
|
||||
"guildLvLimit": 3,
|
||||
"lvLimit": 0,
|
||||
"ranklimit": 0,
|
||||
"purchaseLimit": 1,
|
||||
"refreshType": 2,
|
||||
"money": 40016,
|
||||
"price": "1&100000",
|
||||
"chosen": 0,
|
||||
"indirectId": 0,
|
||||
"vipPurchaseLimit": 0,
|
||||
"seasonNum": 0
|
||||
},
|
||||
{
|
||||
"id": 2207,
|
||||
"goodId": 83601,
|
||||
"goodName": "青龙偃月刀",
|
||||
"num": 1,
|
||||
"shop": 2,
|
||||
"type": 21,
|
||||
"guildLvLimit": 3,
|
||||
"lvLimit": 0,
|
||||
"ranklimit": 0,
|
||||
"purchaseLimit": 1,
|
||||
"refreshType": 2,
|
||||
"money": 40016,
|
||||
"price": "1&100000",
|
||||
"chosen": 0,
|
||||
"indirectId": 0,
|
||||
"vipPurchaseLimit": 0,
|
||||
"seasonNum": 0
|
||||
},
|
||||
{
|
||||
"id": 2208,
|
||||
"goodId": 83701,
|
||||
"goodName": "霸王枪",
|
||||
"num": 1,
|
||||
"shop": 2,
|
||||
"type": 21,
|
||||
"guildLvLimit": 3,
|
||||
"lvLimit": 0,
|
||||
"ranklimit": 0,
|
||||
"purchaseLimit": 1,
|
||||
"refreshType": 2,
|
||||
"money": 40016,
|
||||
"price": "1&100000",
|
||||
"chosen": 0,
|
||||
"indirectId": 0,
|
||||
"vipPurchaseLimit": 0,
|
||||
"seasonNum": 0
|
||||
},
|
||||
{
|
||||
"id": 2209,
|
||||
"goodId": 84001,
|
||||
"goodName": "软香绫",
|
||||
"num": 1,
|
||||
"shop": 2,
|
||||
"type": 21,
|
||||
"guildLvLimit": 3,
|
||||
"lvLimit": 0,
|
||||
"ranklimit": 0,
|
||||
"purchaseLimit": 1,
|
||||
"refreshType": 2,
|
||||
"money": 40016,
|
||||
"price": "1&100000",
|
||||
"chosen": 0,
|
||||
"indirectId": 0,
|
||||
"vipPurchaseLimit": 0,
|
||||
"seasonNum": 0
|
||||
},
|
||||
{
|
||||
"id": 3002,
|
||||
"goodId": 17042,
|
||||
|
||||
@@ -21,7 +21,38 @@
|
||||
{ "id": 7, "desc": "刷新信息", "route": "connector.entryHandler.refresh", "param": {}, "interval": 1000 },
|
||||
{ "id": 8, "desc": "捐赠", "route": "guild.donateHandler.donate", "param": {}, "interval": 200 },
|
||||
{ "id": 9, "desc": "碾压镇念塔", "route": "battle.towerBattleHandler.skipTower", "param": {}, "interval": 200 },
|
||||
{ "id": 10, "desc": "商店购买商品", "route": "role.shopHandler.purchase", "param": {}, "interval": 50 }
|
||||
{ "id": 10, "desc": "商店购买商品", "route": "role.shopHandler.purchase", "param": {}, "interval": 50 },
|
||||
{ "id": 11, "desc": "武将升星", "route": "role.heroHandler.starUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 12, "desc": "武将升品", "route": "role.heroHandler.qualityUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 13, "desc": "武将升级", "route": "role.heroHandler.lvUp", "param": {}, "interval": 500 },
|
||||
{ "id": 14, "desc": "武将升彩星", "route": "role.heroHandler.wakeUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 15, "desc": "武将训练", "route": "role.heroHandler.heroJobTrain", "param": {}, "interval": 1000 },
|
||||
{ "id": 16, "desc": "武将进阶", "route": "role.heroHandler.heroJobStageUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 17, "desc": "武将升羁绊", "route": "role.heroHandler.heroGiveFavor", "param": {}, "interval": 1000 },
|
||||
{ "id": 18, "desc": "解锁天赋", "route": "role.heroHandler.unlockTalent", "param": {}, "interval": 1000 },
|
||||
{ "id": 19, "desc": "升级天赋", "route": "role.heroHandler.upgradeTalent", "param": {}, "interval": 1000 },
|
||||
{ "id": 20, "desc": "天赋洗点", "route": "role.heroHandler.resetTalent", "param": {}, "interval": 1000 },
|
||||
{ "id": 21, "desc": "合成新装备", "route": "role.equipHandler.composeEquip", "param": {}, "interval": 1000 },
|
||||
{ "id": 22, "desc": "装备强化", "route": "role.equipHandler.strengthen", "param": {}, "interval": 1000 },
|
||||
{ "id": 23, "desc": "装备一键强化", "route": "role.equipHandler.strengthenAll", "param": {}, "interval": 1000 },
|
||||
{ "id": 24, "desc": "装备升品", "route": "role.equipHandler.qualityUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 25, "desc": "装备升星", "route": "role.equipHandler.starUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 26, "desc": "锁定随机属性", "route": "role.equipHandler.lockRandSe", "param": {}, "interval": 1000 },
|
||||
{ "id": 27, "desc": "装备洗炼预览", "route": "role.equipHandler.previewRandSe", "param": {}, "interval": 1000 },
|
||||
{ "id": 28, "desc": "装备洗炼", "route": "role.equipHandler.resetRandSe", "param": {}, "interval": 1000 },
|
||||
{ "id": 29, "desc": "装备淬火", "route": "role.equipHandler.quench", "param": {}, "interval": 1000 },
|
||||
{ "id": 30, "desc": "宝石合成", "route": "role.equipHandler.composeStone", "param": {}, "interval": 1000 },
|
||||
{ "id": 31, "desc": "天晶继承", "route": "role.equipHandler.inheritJewel", "param": {}, "interval": 1000 },
|
||||
{ "id": 32, "desc": "宝物升级", "route": "role.artifactHandler.lvUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 33, "desc": "宝物合成", "route": "role.artifactHandler.compose", "param": {}, "interval": 1000 },
|
||||
{ "id": 34, "desc": "宝物一键合成", "route": "role.artifactHandler.composeAll", "param": {}, "interval": 1000 },
|
||||
{ "id": 35, "desc": "宝物转换形态", "route": "role.artifactHandler.transfer", "param": {}, "interval": 1000 },
|
||||
{ "id": 36, "desc": "宝物重铸", "route": "role.artifactHandler.rebuild", "param": {}, "interval": 1000 },
|
||||
{ "id": 37, "desc": "升爵位", "route": "role.roleHandler.roleTitleLevelUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 38, "desc": "神像强化", "route": "role.roleHandler.roleTeraphStrengthen", "param": {}, "interval": 1000 },
|
||||
{ "id": 39, "desc": "神像进阶", "route": "role.roleHandler.roleTeraphQualityUp", "param": {}, "interval": 1000 },
|
||||
{ "id": 40, "desc": "升级名将谱", "route": "role.roleHandler.activeHeroScroll", "param": {}, "interval": 1000 },
|
||||
{ "id": 41, "desc": "战区聊天", "route": "chat.chatHandler.sendGroupMessage", "param": { "channel": "gvg" }, "interval": 30000 }
|
||||
],
|
||||
"TIME_STAMP_OVER": 900000,
|
||||
"ACCESS_CODE_EXPIRE_TIME": 900000,
|
||||
|
||||
Reference in New Issue
Block a user