diff --git a/game-server/app/servers/activity/handler/activityHandler.ts b/game-server/app/servers/activity/handler/activityHandler.ts index 6f5f102fd..cffa34459 100644 --- a/game-server/app/servers/activity/handler/activityHandler.ts +++ b/game-server/app/servers/activity/handler/activityHandler.ts @@ -28,6 +28,7 @@ export class ActivityHandler { const { } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); const sid: string = session.get('sid'); @@ -41,7 +42,7 @@ export class ActivityHandler { for (let activityId of groupData.activities) { let activityData = await getActivityById(activityId); if (activityData) { - let playerActivityData = await getActivity(serverId, roleId, activityId, activityData.type); + let playerActivityData = await getActivity(serverId, roleId, guildCode, activityId, activityData.type); if(playerActivityData) { playerGroupActivityArray.push(playerActivityData); } diff --git a/game-server/app/servers/activity/handler/guildPayHandler.ts b/game-server/app/servers/activity/handler/guildPayHandler.ts new file mode 100644 index 000000000..be45a282d --- /dev/null +++ b/game-server/app/servers/activity/handler/guildPayHandler.ts @@ -0,0 +1,71 @@ +import { Application, BackendSession, HandlerService, pinus, } from 'pinus'; +import { isNumber } from 'underscore'; +import { ITEM_CHANGE_REASON, STATUS } from '../../../consts'; +import { ActivityGuildPayRecordModel } from '../../../db/ActivityGuildPayRecord'; +import { RewardParam } from '../../../domain/activityField/rewardField'; +import { resResult } from '../../../pubUtils/util'; +import { addReward, stringToRewardParam } from '../../../services/activity/giftPackageService'; +import { getGuildPayDataShow, getGuildPayData } from '../../../services/activity/guildPayService'; + + +export default function (app: Application) { + return new GuildPayHandler(app); +} + +export class GuildPayHandler { + constructor(private app: Application) { + } + + + /** + * @description 获取活动数据 + * @param {{ }} msg + * @param {BackendSession} session + * @memberof GuildPayHandler + */ + async getGuildPayData(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + let playerData = await getGuildPayDataShow(serverId, activityId, roleId, guildCode); + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + return resResult(STATUS.SUCCESS, { playerData }); + } + + /** + * @description (一键)领取奖励 + * @param {{ }} msg + * @param {BackendSession} session + * @memberof GuildPayHandler + */ + async receiveItems(msg: { activityId: number, cellIndex: number }, session: BackendSession) { + const { activityId, cellIndex } = msg; + const roleId = session.get('roleId'); + const roleName = session.get('roleName'); + const sid = session.get('sid'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + if(!isNumber(cellIndex)) return resResult(STATUS.WRONG_PARMS); + + let playerData = await getGuildPayData(serverId, activityId, roleId, guildCode); + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + let items = playerData.receiveItems(cellIndex); + if(!items) return resResult(STATUS.ACTIVITY_ITEM_CANNOT_RECEIVE); + + + let records: number[] = [], rewards: RewardParam[] = []; + for(let item of items) { + records.push(item.cellIndex); + rewards.push(...stringToRewardParam(item.reward)); + } + await ActivityGuildPayRecordModel.receiveItems(serverId, activityId, playerData.roundIndex, roleId, records); + let result = await addReward(roleId, roleName, sid, serverId, rewards, ITEM_CHANGE_REASON.ACT_GUILD_PAY_REWARD); + + return resResult(STATUS.SUCCESS, { items, ...result }); + } +} diff --git a/game-server/app/servers/activity/handler/luckyTurntableHandler.ts b/game-server/app/servers/activity/handler/luckyTurntableHandler.ts index 2747adfd1..43f4b9071 100644 --- a/game-server/app/servers/activity/handler/luckyTurntableHandler.ts +++ b/game-server/app/servers/activity/handler/luckyTurntableHandler.ts @@ -61,9 +61,9 @@ export class LuckyTurntableHandler { let { result, records, goodResult } = playerData.pull(roleName, count); await ActivityTurntableModel.updateData(serverId, activityId, roleId, pick(playerData, ['todayCount', 'count', 'records', 'greatRewardCount'])); - let goods = await addItems(roleId, roleName, sid, goodResult, ITEM_CHANGE_REASON.ACT_TURNTABLE_PULL); + await addItems(roleId, roleName, sid, goodResult, ITEM_CHANGE_REASON.ACT_TURNTABLE_PULL); - return resResult(STATUS.SUCCESS, { result, records, goods: combineItems(goods) }); + return resResult(STATUS.SUCCESS, { result, records }); } diff --git a/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts b/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts index 8de6ed423..e2b2fee57 100644 --- a/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts +++ b/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts @@ -33,7 +33,7 @@ export class RechargeMoneyHandler { let playerData = await getPlayerRechargeMoneyDataShow(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); - return resResult(STATUS.SUCCESS, playerData); + return resResult(STATUS.SUCCESS, {playerData}); } /** diff --git a/game-server/app/servers/chat/remote/guildRemote.ts b/game-server/app/servers/chat/remote/guildRemote.ts index 20542c8e7..7e2033483 100644 --- a/game-server/app/servers/chat/remote/guildRemote.ts +++ b/game-server/app/servers/chat/remote/guildRemote.ts @@ -446,4 +446,18 @@ export class GuildRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + /** + * @description 活动推送 + * @param guildCode 军团code + * @param path 推送地址 + * @param param 内容 + */ + public async pushActivityoGuild(guildCode: string, path: string, param: any) { + try { + this.pushMessage(guildCode, path, param); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } \ No newline at end of file diff --git a/game-server/app/services/activity/activityService.ts b/game-server/app/services/activity/activityService.ts index 72a576c7a..219fcbf03 100644 --- a/game-server/app/services/activity/activityService.ts +++ b/game-server/app/services/activity/activityService.ts @@ -37,6 +37,7 @@ import { getTimeLimitRankDataShow } from './timeLimitRankService'; import { ActivityTaskPointModel } from '../../db/ActivityTaskPoint'; import { getRoleOnlineInfo } from '../redisService'; import { addTaskPassPoint } from './taskPassService'; +import { getGuildChannelSid } from '../chatService'; /** * 获取活动数据 @@ -46,7 +47,7 @@ import { addTaskPassPoint } from './taskPassService'; * @param {string} roleId 角色Id * */ -export async function getActivity(serverId: number, roleId: string, activityId: number, activityType: number) { +export async function getActivity(serverId: number, roleId: string, guildCode: string, activityId: number, activityType: number) { let activityData = null; switch (activityType) { case ACTIVITY_TYPE.SIGN_IN://签到 4 @@ -200,6 +201,10 @@ export async function getActivity(serverId: number, roleId: string, activityId: activityData = await getTimeLimitRankDataShow(activityId); break; } + case ACTIVITY_TYPE.GUILD_PAY: + { + + } default: { console.log('未知活动类型.........', activityType) break; @@ -357,6 +362,8 @@ export async function addActvityTaskPoint(type: number, id: number, session: Bac interface pushActivityParamInter { ticketCnt?: number; // 木签活动的签数(type21) totalPoint?: number; // 新将好礼(type37)和战令(type42)更新后的积分 + payMemberCnt?: number; // 军团充值活动,你的军团充值的人数 + payMember?: string; // 军团充值活动,充值人员名字,添加到payRecord里面 } export interface pushActivityInter { @@ -374,9 +381,23 @@ export async function pushActivities(arr: pushActivityInter[], roleId: string, s let onlineUser = await getRoleOnlineInfo(roleId); sid = onlineUser.sid; } - pinus.app.get('channelService').pushMessageByUids('onActivityUpdate', - resResult(STATUS.SUCCESS, { - activities: arr - }), - [{ uid: roleId, sid }]); + if(!!sid && arr.length > 0) { + pinus.app.get('channelService').pushMessageByUids('onActivityUpdate', + resResult(STATUS.SUCCESS, { + activities: arr + }), + [{ uid: roleId, sid }]); + } +} + +export async function pushActivitiesToGuild(arr: pushActivityInter[], guildCode: string) { + let chatSid = await getGuildChannelSid(guildCode); + console.log('####', chatSid, arr) + if(!!chatSid && arr.length > 0) { + pinus.app.rpc.chat.guildRemote.sendMailToGuild.toServer(chatSid, guildCode, 'onActivityUpdate', + resResult(STATUS.SUCCESS, { + activities: arr + }), + ); + } } \ No newline at end of file diff --git a/game-server/app/services/activity/guildPayService.ts b/game-server/app/services/activity/guildPayService.ts new file mode 100644 index 000000000..31878b49e --- /dev/null +++ b/game-server/app/services/activity/guildPayService.ts @@ -0,0 +1,61 @@ +import { ACTIVITY_TYPE } from "../../consts"; +import { ActivityGuildPayModel } from "../../db/ActivityGuildPay"; +import { RoleType } from "../../db/Role"; +import { GuildPayData } from "../../domain/activityField/guildPay"; +import { getActivitiesByType, getActivityById, pushActivitiesToGuild, pushActivityInter } from "./activityService"; +import { ServerlistModel } from '../../db/Serverlist'; +import { ActivityGuildPayRecordModel } from "../../db/ActivityGuildPayRecord"; + + +/** + * 玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ + export async function getGuildPayData(serverId: number, activityId: number, roleId: string, guildCode: string) { + let activityData = await getActivityById(activityId); + let { openTime } = await ServerlistModel.findByServerId(serverId); + + let playerData = new GuildPayData(activityData, 0, openTime * 1000); + let receiveRecord = await ActivityGuildPayRecordModel.findData(serverId, activityId, playerData.roundIndex, roleId); + playerData.setReceiveRecord(receiveRecord); + if(guildCode) { + let guildRecord = await ActivityGuildPayModel.findData(serverId, activityId, playerData.roundIndex, guildCode); + playerData.setGuildRecord(guildRecord); + } + + return playerData; +} + +export async function getGuildPayDataShow(serverId: number, activityId: number, roleId: string, guildCode: string) { + let playerData = await getGuildPayData(serverId, activityId, roleId, guildCode); + if(playerData && playerData.canShow && playerData.canShow()) { + return playerData.getShowResult(); + } + return null; +} + +export async function addGuildPay(role: RoleType, price: number) { + let { hasGuild, roleId, roleName, serverId, guildCode } = role; + if(hasGuild) { // 向全军团推送充值的人 + let { openTime } = await ServerlistModel.findByServerId(serverId); + let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY); + let pushResult: pushActivityInter[] = []; + for(let activityData of activities) { + let { activityId, type: activityType } = activityData; + let obj = new GuildPayData(activityData, 0, openTime * 1000); + + let { isNew, result } = await ActivityGuildPayModel.addRecord(serverId, activityId, obj.roundIndex, guildCode, { + roleId, roleName, price + }); + if(isNew) { + let { memberRecord } = result; + pushResult.push({ activityId, activityType, param: { payMember: roleName, payMemberCnt: memberRecord.length } }); + } + } + await pushActivitiesToGuild(pushResult, guildCode); + } +} \ No newline at end of file diff --git a/game-server/app/services/orderService.ts b/game-server/app/services/orderService.ts index eda66365f..7ab482689 100644 --- a/game-server/app/services/orderService.ts +++ b/game-server/app/services/orderService.ts @@ -30,6 +30,7 @@ import { reportTAEvent, reportTAUserSet } from './sdkService'; import { savePayLog } from '../pubUtils/logUtil'; import { recordFirstGift } from './activity/firstGiftService'; import { makeTaskPass } from './activity/taskPassService'; +import { addGuildPay } from './activity/guildPayService'; /** @@ -151,7 +152,7 @@ export async function makeOrder(orderInfo: UserOrderModelType, sid: string) { totalPay: roleInfo.totalPay }), [{ uid: roleId, sid }]); - return rewardResult + return {...rewardResult, roleInfo} } export async function settleOrder(order: UserOrderModelType, serverId: number, sid?: string) { @@ -180,6 +181,7 @@ export async function settleOrder(order: UserOrderModelType, serverId: number, s //活动统计 addRechargeMoney(order.roleId, serverId, order.price); addVipRechargeMoney(order.roleId, serverId, order.price); + addGuildPay(result.roleInfo, order.price) //成长任务 await checkActivityTask(serverId, sid, order.roleId, TASK_TYPE.ACTIVITY_RMB, order.price, { activityId: order.activityId }); if(order.payType != PAY_TYPE.TEST) { diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index d748ba97c..65de526d2 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -55,6 +55,7 @@ export enum ACTIVITY_TYPE { LUCKY_TURNTABLE = 40, // 幸运转盘 TIME_LIMIT_RANK = 41, // 限时排行榜 TASK_PASS = 42, // 战令活动 + GUILD_PAY = 43, // 军团充值人数 } /** diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 263196330..ef64bed73 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -1005,6 +1005,7 @@ export enum ITEM_CHANGE_REASON { ACT_TURNTABLE_PULL = 141, // 转盘 ACT_TASK_PASS = 142, // 活动-战令奖励 ACT_TASK_PASS_SPD_UP = 143, // 活动-战令加速 + ACT_GUILD_PAY_REWARD = 144, // 活动-军团人数奖励 } export enum TA_EVENT { diff --git a/shared/db/ActivityGuildPay.ts b/shared/db/ActivityGuildPay.ts new file mode 100644 index 000000000..7548c5a31 --- /dev/null +++ b/shared/db/ActivityGuildPay.ts @@ -0,0 +1,60 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +class MemberRecord { + @prop({ required: true }) + roleId: string; + @prop({ required: true }) + roleName: string; + @prop({ required: true }) + price: number; // 金额 +} + + +/** + * 活动系统 - 成长任务活动积分点兑换奖励 +*/ +@index({ serverId: 1, guildCode: 1, activityId: 1, roundIndex: 1 }) + +export default class Activity_Guild_Pay extends BaseModel { + @prop({ required: true }) + serverId: number; // 区服id + + @prop({ required: true }) + activityId: number; // 活动Id + + @prop({ required: true }) + roundIndex: number; // 活动第几轮 + + @prop({ required: true }) + guildCode: string; // 军团code + + @prop({ required: true, type: MemberRecord, _id: false }) + memberRecord: MemberRecord[]; // 充值的玩家 + + //当日奖章领取记录 + public static async addRecord(serverId: number, activityId: number, roundIndex: number, guildCode: string, memberRecord: MemberRecord) { + let result: ActivityGuildPayModelType = await ActivityGuildPayModel.findOne({ serverId, guildCode, activityId, roundIndex }).lean(); + let hasUser = result?.memberRecord?.find(cur => cur.roleId == memberRecord.roleId); + if(!hasUser) { + result = await ActivityGuildPayModel.findOneAndUpdate({ serverId, guildCode, activityId, roundIndex }, { $push: { memberRecord } }, { new: true, upsert: true }).lean(); + } else { + result = await ActivityGuildPayModel.findOneAndUpdate({ serverId, guildCode, activityId, roundIndex, 'memberRecord.roleId': memberRecord.roleId }, { + $set: { 'memberRecord.$.roleName': memberRecord.roleName }, + $inc: { 'memberRecord.$.price': memberRecord.price } + }, { new: true }).lean(); + } + return { result, isNew: !hasUser }; + } + + //根据活动id查询活动数据 + public static async findData(serverId: number, activityId: number, roundIndex: number, guildCode: string) { + let result: ActivityGuildPayModelType = await ActivityGuildPayModel.findOne({ serverId, activityId, roundIndex, guildCode }).lean(true); + return result; + } +} + +export const ActivityGuildPayModel = getModelForClass(Activity_Guild_Pay); + +export interface ActivityGuildPayModelType extends Pick, keyof Activity_Guild_Pay> { } +export type ActivityGuildPayModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/db/ActivityGuildPayRecord.ts b/shared/db/ActivityGuildPayRecord.ts new file mode 100644 index 000000000..113db5383 --- /dev/null +++ b/shared/db/ActivityGuildPayRecord.ts @@ -0,0 +1,46 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + + +/** + * 活动系统 - 成长任务活动积分点兑换奖励 +*/ +@index({ serverId: 1, guildCode: 1, activityId: 1, roundIndex: 1 }) + +export default class Activity_Guild_Pay_Record extends BaseModel { + @prop({ required: true }) + serverId: number; // 区服id + + @prop({ required: true }) + activityId: number; // 活动Id + + @prop({ required: true }) + roundIndex: number; // 活动第几轮 + + @prop({ required: true }) + roleId: string; // 军团code + + @prop({ required: true, type: Number }) + receiveRecord: number[]; // 领取记录, cellIndex + + + //根据活动id查询活动数据 + public static async findData(serverId: number, activityId: number, roundIndex: number, roleId: string) { + let result: ActivityGuildPayRecordModelType = await ActivityGuildPayRecordModel.findOne({ serverId, roleId, activityId, roundIndex }).lean(true); + return result; + } + + public static async receiveItems(serverId: number, activityId: number, roundIndex: number, roleId: string, records: number[]) { + let result: ActivityGuildPayRecordModelType = await ActivityGuildPayRecordModel.findOneAndUpdate( + { serverId, roleId, activityId, roundIndex }, + { $push: { receiveRecord: { $each: records } } }, + { upsert: true, new: true } + ).lean(true); + return result; + } +} + +export const ActivityGuildPayRecordModel = getModelForClass(Activity_Guild_Pay_Record); + +export interface ActivityGuildPayRecordModelType extends Pick, keyof Activity_Guild_Pay_Record> { } +export type ActivityGuildPayRecordModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/activityField.ts b/shared/domain/activityField/activityField.ts index 2e12384a9..b1f7e20f2 100644 --- a/shared/domain/activityField/activityField.ts +++ b/shared/domain/activityField/activityField.ts @@ -1,5 +1,5 @@ import moment = require('moment'); -import { ACTIVITY_TIME_TYPE, REFRESH_TIME, SERVER_OPEN_TIME } from '../../consts'; +import { ACTIVITY_TIME_TYPE, REFRESH_TIME } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; import { deltaDays } from '../../pubUtils/util'; @@ -45,7 +45,7 @@ export abstract class ActivityBase { } } - constructor(activityData: ActivityModelType, createTime: number) { + constructor(activityData: ActivityModelType, createTime: number, serverTime?: number) { this.activityId = activityData.activityId; this.delayDay = activityData.delayDay ? activityData.delayDay : 0; this.beginTime = moment(activityData.beginTime).add(this.delayDay, 'd').valueOf(); @@ -60,7 +60,7 @@ export abstract class ActivityBase { console.log('***** activityData', activityData.timeType) switch (activityData.timeType) { case ACTIVITY_TIME_TYPE.SERVER_OPEN_TIME: { - this.beginTime = moment(SERVER_OPEN_TIME).add(this.delayDay, 'd').startOf('d').add(REFRESH_TIME, 'h').valueOf(); + this.beginTime = moment(serverTime).add(this.delayDay, 'd').startOf('d').add(REFRESH_TIME, 'h').valueOf(); if (activityData.days > 0) { this.endTime = moment(this.beginTime).add(activityData.days, 'd').valueOf(); } else { diff --git a/shared/domain/activityField/guildPay.ts b/shared/domain/activityField/guildPay.ts new file mode 100644 index 000000000..e62276a01 --- /dev/null +++ b/shared/domain/activityField/guildPay.ts @@ -0,0 +1,108 @@ +// 军团限时充值人数活动 + +import { ActivityModelType } from "../../db/Activity"; +import { ActivityGuildPayModelType } from "../../db/ActivityGuildPay"; +import { ActivityGuildPayRecordModelType } from "../../db/ActivityGuildPayRecord"; +import { ActivityBase } from "./activityField"; + +interface GuildPayRewardInDb { + cellIndex: number; // 第几条 + memberCnt: number; // 充值金额达到目标金额的玩家人数 + reward: string; // 奖励 type&id&count +} + +interface GuildPayDataInDb { + rewards: GuildPayRewardInDb[]; + payDays: number; // 充值计入的天数,这之后到活动endTime为公示期,充值不会计入活动 +} + +export class GuildPayReward { + cellIndex: number; // 第几条 + memberCnt: number; // 充值金额达到目标金额的玩家人数 + reward: string; // 奖励 type&id&count + + hasReceived: boolean = false; // 玩家是否已领取 + + constructor(data: GuildPayRewardInDb) { + this.cellIndex = data.cellIndex; + this.memberCnt = data.memberCnt; + this.reward = data.reward; + } + + public setHasReceived(hasReceived: boolean) { + this.hasReceived = hasReceived; + } +} + +export class GuildPayData extends ActivityBase { + payEndTime: number; + rewards: GuildPayReward[] = []; + map: Map = new Map(); + + payMemberCnt: number = 0; + payRecord: string[] = []; + + constructor(activityData: ActivityModelType, createTime: number, serverTime?: number) { + super(activityData, createTime, serverTime) + this.initData(activityData.data) + } + + public initData(data: string) { + let dataObj: GuildPayDataInDb = JSON.parse(data); + this.payEndTime = this.beginTime + dataObj.payDays * 24 * 60 * 60 * 1000; + for(let reward of dataObj.rewards) { + let obj = new GuildPayReward(reward); + this.rewards.push(obj); + this.map.set(obj.cellIndex, this.rewards.length - 1); + } + } + + public findRewardItemByCellIndex(cellIndex: number) { + let index = this.map.get(cellIndex); + return this.rewards[index]; + } + + public setReceiveRecord(receiveRecord: ActivityGuildPayRecordModelType) { + if(!receiveRecord) return; + for(let cellIndex of receiveRecord.receiveRecord) { + let reward = this.findRewardItemByCellIndex(cellIndex); + reward.setHasReceived(true); + } + } + + public setGuildRecord(guildRecord: ActivityGuildPayModelType) { + if(!guildRecord) return; + this.payMemberCnt = guildRecord.memberRecord.length; + this.payRecord = guildRecord.memberRecord.map(cur => cur.roleName); + } + + public getShowResult() { + return { + ...this.getBaseKeys(), + payEndTime: this.payEndTime, + rewards: this.rewards, + payMemberCnt: this.payMemberCnt, + payRecord: this.payRecord + } + } + + public receiveItems(cellIndex: number) { + let items: GuildPayReward[] = []; + if(cellIndex == 0) { + for(let reward of this.rewards) { + if(reward.memberCnt <= this.payMemberCnt && !reward.hasReceived) { + reward.setHasReceived(true); + items.push(reward); + } + } + } else { + let reward = this.findRewardItemByCellIndex(cellIndex); + if(reward && !reward.hasReceived && reward.memberCnt <= this.payMemberCnt) { + reward.setHasReceived(true); + items.push(reward); + } + } + if(items.length <= 0) return false; + return items + } +} \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_activityType.json b/shared/resource/jsons/dic_zyz_activityType.json index a55e2f523..df87e55f1 100644 --- a/shared/resource/jsons/dic_zyz_activityType.json +++ b/shared/resource/jsons/dic_zyz_activityType.json @@ -250,5 +250,11 @@ "activityType": 42, "name": "TASK_PASS", "string": "战令" + }, + { + "id": 43, + "activityType": 43, + "name": "GUILD_PAY", + "string": "军团限时付费" } ] \ No newline at end of file