Merge remote-tracking branch 'origin/release' into bugfix

This commit is contained in:
xcy 2023-12-23 00:40:20 +08:00
commit 7354ad9ae8
69 changed files with 5759 additions and 933 deletions

View File

@ -1,41 +1,34 @@
import { ApiCall } from "tsrpc"; import {ApiCall} from "tsrpc";
import { PayFun } from '../../../public/pay'; import {PayFun} from '../../../public/pay';
import { PlayerFun } from '../../../public/player'; import {PlayerFun} from '../../../public/player';
import { ReqRec, ResRec } from "../../../shared/protocols/event/136Gift/PtlRec"; import {ReqRec, ResRec} from "../../../shared/protocols/event/136Gift/PtlRec";
import { prizeType } from '../../../shared/protocols/type'; import {prizeType} from '../../../shared/protocols/type';
import { PublicShared } from '../../../shared/public/public'; import {PublicShared} from '../../../shared/public/public';
import { HongDianChange } from "../../hongdian/fun"; import {HongDianChange} from "../../hongdian/fun";
/**
*
* @param call
*/
export default async function (call: ApiCall<ReqRec, ResRec>) { export default async function (call: ApiCall<ReqRec, ResRec>) {
let conf = G.gc.dixiaheishi['136Gift'][call.req.index]; let conf = G.gc.dixiaheishi['136Gift'][call.req.index];
let buyLog = await PayFun.getPayLog(call.uid, G.gc.dixiaheishi['136Gift'][0].payId); if (!conf || conf.payId) return call.error('', {code: -1});
let buy60 = buyLog.slice(-1)[0]?.eTime >= G.time; // if (!buy60 && conf.payId) return call.error('', { code: -2 });
if (!conf) return call.error('', { code: -1 });
if (!buy60 && conf.payId) return call.error('', { code: -2 });
let prize: prizeType[] = []; let prize: prizeType[] = [];
let pushIndex: number[] = []; let pushIndex: number[] = [];
let db = await G.mongodb.cEvent('136Gift').findOne({ uid: call.uid, type: '136Gift' }); let db = await G.mongodb.cEvent('136Gift').findOne({uid: call.uid, type: '136Gift'});
if (call.req.index == 0) { if (db.recIndex.includes(call.req.index)) return call.error('', {code: -3});
G.gc.dixiaheishi['136Gift'].forEach((c, i) => { prize.push(...(conf.payId ? G.gc.pay[conf.payId].prize : conf.prize));
if (i == 0 || !c.payId || db.recIndex.includes(i)) return; pushIndex.push(call.req.index);
pushIndex.push(i);
prize.push(...G.gc.pay[c.payId].prize);
});
if (pushIndex.length < 1) return call.error('', { code: -4 });
} else {
if (db.recIndex.includes(call.req.index)) return call.error('', { code: -3 });
prize.push(...(conf.payId ? G.gc.pay[conf.payId].prize : conf.prize));
pushIndex.push(call.req.index);
}
prize = PublicShared.mergePrize(prize); prize = PublicShared.mergePrize(prize);
await PlayerFun.sendPrize(call, prize); await PlayerFun.sendPrize(call, prize);
G.mongodb.cEvent('136Gift').updateOne( G.mongodb.cEvent('136Gift').updateOne(
{ uid: call.uid, type: '136Gift' }, {uid: call.uid, type: '136Gift'},
{ $push: { recIndex: { $each: pushIndex } } } {$push: {recIndex: {$each: pushIndex}}}
); );
// HongDianChange.sendChangeKey(call.uid, ['heishihd', 'heishiMrjx']) // HongDianChange.sendChangeKey(call.uid, ['heishihd', 'heishiMrjx'])

View File

@ -0,0 +1,21 @@
import {ApiCall} from "tsrpc";
import {ReqOpen, ResOpen} from "../../../shared/protocols/event/leichonglibao/PtlOpen";
export default async function (call: ApiCall<ReqOpen, ResOpen>) {
let data = await G.mongodb.cEvent(`leichonglibao${call.req.hdid}`).findOne(
{type: `leichonglibao${call.req.hdid}`, uid: call.uid}
)
let change = {opentime: G.time}
if (!data) {
Object.assign(change, {sc: false, buy: []})
}
// 每天open红点
G.mongodb.cEvent(`leichonglibao${call.req.hdid}`).updateOne(
{type: `leichonglibao${call.req.hdid}`, uid: call.uid}, {$set: change}, {upsert: true}
)
let temp = Object.assign((data || {}), change) as ResOpen & { opentime }
call.succ({sc: temp.sc, buy: temp.buy});
}

View File

@ -0,0 +1,120 @@
import {ApiCall} from "tsrpc";
import {HuoDongFun} from "../../../public/huodongfun";
import {ReqReceive, ResReceive} from "../../../shared/protocols/event/leichonglibao/PtlReceive";
import {PlayerFun} from "../../../public/player";
import {PublicShared} from "../../../shared/public/public";
export type LeiChongLiBaoData = {
intr: string
intr2: string
payRewardNum: number
dlz: { [key: string]: atn }[]
gift: {
id: string, name: string, need: atn[], free: boolean, payId: string, scale: number, buynum: number, prize: atn[]
}[]
}
export default async function (call: ApiCall<ReqReceive, ResReceive>) {
let hdinfo = await HuoDongFun.gethdList(call, 12);
if (hdinfo.length <= 0) {
// 无此活动
return call.error('', {code: -1, message: globalThis.lng.huodong_open_1})
}
let hddata = hdinfo.filter(i => i.hdid == call.req.hdid)[0].data as LeiChongLiBaoData;
let data = await G.mongodb.cEvent(`leichonglibao${call.req.hdid}`).findOne(
{type: `leichonglibao${call.req.hdid}`, uid: call.uid}
)
if (data.sc) {
// 自选奖励已领取
return call.error('', {code: -1, message: globalThis.lng.task_finsh_3})
}
if (data.buy.length < hddata.payRewardNum) {
// 累计购买礼包次数不足
return call.error("", {code: -1, message: globalThis.lng.ljlibaotips_8})
}
let _prize: atn[] = [];
for (let i = 0; i < hddata.dlz.length; i++) {
_prize.push(hddata.dlz[i][call.req.select[i] || "1"])
}
// 修改领取标识
await G.mongodb.cEvent(`leichonglibao${call.req.hdid}`).updateOne(
{type: `leichonglibao${call.req.hdid}`, uid: call.uid}, {$set: {sc: true}}
)
PlayerFun.sendPrize(call, _prize)
call.succ({prize: _prize})
}
export async function LeiChongLiBaoBuyGift(call: ApiCall, payId: string) {
let hdinfo = await HuoDongFun.gethdList(call, 12);
if (hdinfo.length <= 0) {
console.log(call.uid, "购买累充礼包 但是活动没有开启", payId);
return
}
let gift: LeiChongLiBaoData["gift"][0];
let hdid = hdinfo[0].hdid;
let hddata = hdinfo[0].data as LeiChongLiBaoData;
for (let g of hddata.gift) {
if (g.payId == payId) {
gift = g;
break;
}
}
if (!gift) return; // 不是购买累充礼包
let mydata = await G.mongodb.cEvent(`leichonglibao${hdid}`).findOne(
{type: `leichonglibao${hdid}`, uid: call.uid}
)
if (mydata && mydata.buy.includes(gift.payId)) {
console.log(call.uid, "购买累充礼包 重复购买", payId);
return
}
let update;
if (mydata) {
update = {$push: {buy: payId}}
} else {
update = {$set: {opentime: G.time, sc: false, buy: [payId]}}
}
PlayerFun.sendPrize(call, gift.prize)
G.mongodb.cEvent(`leichonglibao${hdid}`).updateOne(
{uid: call.uid, type: `leichonglibao${hdid}`}, update
)
}
export async function LeiChongLiBaoGetHongDian(call: ApiCall) {
let hdinfo = await HuoDongFun.gethdList(call, 12);
if (hdinfo.length <= 0) {
return {show: false}
}
let hdid = hdinfo[0].hdid;
let hddata = hdinfo[0].data as LeiChongLiBaoData;
let mydata = await G.mongodb.cEvent(`leichonglibao${hdid}`).findOne(
{type: `leichonglibao${hdid}`, uid: call.uid}
)
if (!mydata || mydata.opentime < PublicShared.getToDayZeroTime()) {
return {show: true}
}
if (!mydata.sc && mydata.buy.length >= hddata.payRewardNum) {
return {show: true}
}
return {show: false}
}

View File

@ -0,0 +1,69 @@
import { ApiCall } from "tsrpc";
import { HuoDongFun } from "../../../public/huodongfun";
import { ReqCanReceive, ResCanReceive } from '../../../shared/protocols/event/payForDiamond/PtlCanReceive';
import { PublicShared } from "../../../shared/public/public";
import { ActionLog } from "../../../public/actionLog/actionLog";
import { WithId, OptionalId } from "mongodb";
import { ReqAddHuoDong } from "../../../monopoly/protocols/PtlAddHuoDong";
const hasGotKeyPrefix = 'payForDiamond:hasGot:'; // 已领取额度
const showOffListKeyPrefix = 'payForDiamond:ShowOff:'; // 需要炫耀的玩家列表。 其中需要包含信息:玩家区服, 玩家玩家名称, 领到的数量
export async function playerCanReceive(call: ApiCall, callError : boolean = true) {
let activityId = call.req.activityId;
let activityInfo: WithId<OptionalId<ReqAddHuoDong>>;
if (!activityId) {
activityInfo = (await HuoDongFun.gethdList(call, 13))[0];
} else {
activityInfo = await HuoDongFun.getHdidInfo(call, activityId);
}
if (!activityInfo) {
if (callError) {
return call.error('', { code: -1, message: lng.huodong_open_1 });
} else {
return { result: false };
}
}
activityId = activityInfo.hdid;
const hasReceivedKey = hasGotKeyPrefix + activityId;
const hasReceivedStr = await G.iorediscross.get(hasReceivedKey);
const hasReceived = hasReceivedStr? parseInt(hasReceivedStr) : 0;
const remaining = activityInfo.data['totalmoney'] - hasReceived;
const showOffResult = await G.iorediscross.lrange(showOffListKeyPrefix + activityId, 0, -1);
const showOffList = showOffResult.map(result => JSON.parse(result));
const zeroTime = PublicShared.getToDayZeroTime();
const vipScore = await ActionLog.getDayLog(call.uid, 'pay');
const price = activityInfo.data['price'];
if (!vipScore) {
return {
payNum: 0, remaining, result: false, activityInfo, showOffList, price, gotAmount: 0
};
}
const payNum = vipScore;
// 玩家充值未达标或者奖池余额耗尽则不能领取
if (payNum < price || remaining <= 0) {
return {
payNum, remaining, result: false, activityInfo, showOffList, price, gotAmount: 0
}
}
// 检查玩家今日是否已经领取
const playerActivityInfo = await G.mongodb.cEvent('payForDiamond').findOne({ uid: call.uid, type: 'payForDiamond' });
if (playerActivityInfo) {
if (playerActivityInfo[zeroTime]) {
return {
payNum, remaining, result: false, activityInfo, showOffList, price, gotAmount: playerActivityInfo[zeroTime]
};
}
}
return {
payNum, remaining, result: true, activityInfo, showOffList, price, gotAmount: 0
};
}
export default async function (call: ApiCall<ReqCanReceive, ResCanReceive>) {
const canReceiveResult = await playerCanReceive(call);
if (canReceiveResult) {
const { payNum, remaining, result, showOffList, price, gotAmount } = canReceiveResult;
call.succ({ payNum, remaining, result, showOffList, price, gotAmount });
}
}

View File

@ -0,0 +1,121 @@
import { ApiCall } from "tsrpc";
import { ReqReceive, ResReceive } from '../../../shared/protocols/event/payForDiamond/PtlReceive';
import { playerCanReceive } from './ApiCanReceive';
import { PublicShared } from "../../../shared/public/public";
import { PlayerFun } from "../../../public/player";
type diamondWeightGroup = {
weight: number;
numrange: [ min: number, max: number];
};
const hasGotKeyPrefix = 'payForDiamond:hasGot:'; // 已领取额度
const hasGotLockKey = "payForDiamond:lock"; // 更新锁, TTL 1s
const showOffListKeyPrefix = 'payForDiamond:ShowOff:'; // 需要炫耀的玩家列表。 其中需要包含信息:玩家区服, 玩家玩家名称, 领到的数量
/**
* @param groups
*/
function randomWithWeight(groups: diamondWeightGroup[]) {
let maxAmount: number;
let totalWeights = 0;
for (const group of groups) {
totalWeights += group.weight;
if (!maxAmount) {
maxAmount = group.numrange[1];
} else {
maxAmount = Math.max(maxAmount, group.numrange[1]);
}
}
const randomValue = Math.random() * totalWeights; // 随机值落在[0, totalWeights) 之间
let currSum = 0;
for (const group of groups) {
if (currSum <= randomValue && randomValue < currSum + group.weight) {
return { group, maxAmount };
} else {
currSum += group.weight;
}
}
const length = groups.length;
return { group: groups[length - 1], maxAmount };
}
/**
*
* @param remaining
* @param group
* @param maxAmount
*/
function calcDiamondGot(remaining: number, group: diamondWeightGroup, maxAmount: number) {
const [min, max] = group.numrange;
const randomAmount = Math.floor(Math.random() * (max - min)) + min + 1; // max 值应能够取到, 故 +1
// 剩余数额小于组内随机得到的值, 全给吧
if (randomAmount > remaining) {
return remaining;
}
// 随机值大于最大值, 取最大值
if (randomAmount > maxAmount) {
return maxAmount;
}
return randomAmount;
}
export default async function (call: ApiCall<ReqReceive, ResReceive>) {
const canReceiveResult = await playerCanReceive(call);
if (canReceiveResult) { // 该值不存在的情况已被函数直接返回 error, 无需再处理
if (!canReceiveResult.result) {
return call.succ({
amount: 0,
timesRemaining: 0,
showOff: false
});
}
const activityData = canReceiveResult.activityInfo.data;
// 更新 redis 领取记录之前先加锁, 防止多领
const lockResult = await G.iorediscross.setnx(hasGotLockKey, 1);
if (lockResult) {
await G.iorediscross.expire(hasGotLockKey, 1); // 设置 ttl 避免死锁
const activityId = call.req.activityId;
const hasReceivedKey = hasGotKeyPrefix + activityId;
const hasReceivedStr = await G.iorediscross.get(hasReceivedKey);
const hasReceived = hasReceivedStr? parseInt(hasReceivedStr) : 0;
const remaining = activityData['totalmoney'] - hasReceived;
if (remaining <= 0) {
return call.succ({
amount: 0
});
} else {
const { group, maxAmount } = randomWithWeight(activityData['groupConf']['base']['arr']);
const gotAmount = calcDiamondGot(remaining, group, maxAmount);
await G.iorediscross.incrby(hasReceivedKey, Math.abs(gotAmount)); // 添加已领取的额度
await G.iorediscross.del(hasGotLockKey); // 移除锁
await PlayerFun.sendPrize(call, [{ 'a': 'attr', 't': 'rmbmoney', 'n': gotAmount }]);
const showOff = gotAmount >= activityData['groupConf']['base']['loglimit'];
call.succ({ // 领取核心逻辑完成, 请求可以返回了
amount: gotAmount,
timesRemaining: 0,
showOff,
});
// 添加玩家领取记录
const zeroTime = PublicShared.getToDayZeroTime();
const setObj = {};
setObj[zeroTime] = gotAmount;
await G.mongodb.cEvent('payForDiamond').updateOne({ uid: call.uid, type: 'payForDiamond' }, {
$set: setObj
}, {upsert: true});
// 炫耀
if (showOff) {
const msg = JSON.stringify({
name: call.conn.gud.name, gotAmount, serverID: call.conn.gud.sid
});
const showOffListKey = showOffListKeyPrefix + activityId;
await G.iorediscross.lpush(showOffListKey, msg);
await G.ioredis.ltrim(showOffListKey, 0, 49); // 限制列表保存 50 条消息, 避免无限增长
}
}
} else {
return call.succ({
amount: 0
});
}
}
}

View File

@ -0,0 +1,26 @@
import {ApiCall} from "tsrpc";
import {ReqOpen, ResOpen} from "../../../shared/protocols/event/zhoumolibao/PtlOpen";
import {PayFun} from "../../../public/pay";
import {HuoDongFun} from "../../../public/huodongfun";
import {PublicShared} from "../../../shared/public/public";
export default async function (call: ApiCall<ReqOpen, ResOpen>) {
let data = await G.mongodb.cEvent('pobinglibao').findOne({uid: call.uid, type: 'pobinglibao'})
let _hd = (await HuoDongFun.gethdList(call, 10))[0]
if (!_hd) return call.errorCode(-1)
let payIds = _hd?.data?.gift?.filter(i => i.payId)?.map(i => i.payId)
let payLog: any = await PayFun.getPayLogs(call.uid, payIds)
for (let key in payLog) {
payLog[key]?.filter(i => i.time > _hd.stime && i.time < _hd.etime)
}
call.succ({
record: data?.record || {},
buyLog: payLog
})
}

View File

@ -0,0 +1,33 @@
import {ApiCall} from "tsrpc";
import {ReqReceive, ResReceive} from "../../../shared/protocols/event/pobinglibao/PtlReceive";
import {HuoDongFun} from "../../../public/huodongfun";
import {PlayerFun} from "../../../public/player";
import {HongDianChange} from "../../hongdian/fun";
import {PayFun} from "../../../public/pay";
export default async function (call: ApiCall<ReqReceive, ResReceive>) {
// 查询活动是否有当前领奖的免费选项
let _hd = (await HuoDongFun.gethdList(call, 10))[0]
let gift = _hd?.data?.gift?.find(i => i.id == call.req.id)
if (!gift) return call.errorCode(-1)
let payLog = await PayFun.getPayLog(call.uid, gift.payId)
payLog = payLog?.filter(i => i.time >= _hd.stime && i.time <= _hd.etime) || []
if (!payLog || !payLog.length) return call.errorCode(-2)
// 取奖励列表,判断是否有可领取奖励
let data = await G.mongodb.cEvent('pobinglibao').findOne({uid: call.uid, type: 'pobinglibao'})
let rec = data?.record?.[call.req.id]?.length
if (rec && (rec >= 3 || data?.record?.[gift.id] == call.req.recId)) return call.errorCode(-3)
await PlayerFun.sendPrize(call, gift[call.req.recId]);
await G.mongodb.cEvent('pobinglibao').updateOne({uid: call.uid, type: 'pobinglibao'}, {
$push: {[`record.${gift.id}`]: call.req.recId},
}, {upsert: true})
call.succ({})
HongDianChange.sendChangeKey(call.uid, ['pobinglibao']);
}

View File

@ -0,0 +1,91 @@
import {ApiCall} from "tsrpc";
import {ReqOpen, ResOpen} from "../../../shared/protocols/event/xiaofeijingsai/PtlOpen";
import {HuoDongFun} from "../../../public/huodongfun";
/**
*
* redis缓存120秒
*
* @param call
*/
export default async function (call: ApiCall<ReqOpen, ResOpen>) {
let ioList = await G.ioredis.get(`rank:xiaofeijingsai`);
if (ioList) {
let myData = await getMyData(call, JSON.parse(ioList))
return call.succ({list: JSON.parse(ioList), myData})
}
let _hd = (await HuoDongFun.gethdList(call, 11))[0]
if (!_hd) return call.errorCode(-1)
let limit = _hd.data?.rank?.slice(-1)?.[0]?.rank?.slice(-1)?.[0] || call.req.limit || 100
let rmbuse = await G.mongodb.collection('rmbuse').aggregate([
{$match: {isAdd: false, cTime: {$gte: _hd.stime, $lte: _hd.etime}}},
{$group: {_id: "$uid", total: {$sum: "$change"}}},
{$sort: {total: 1}},
{$limit: limit}
]).toArray()
let list: any = rmbuse.map(i => ({...i, total: R.negate(i.total)}))
let rankList = sortRankList(_hd.data.rank, list)
let users = await G.mongodb.collection('user').find({uid: {$in: rankList.map(i => i._id).filter(i => i._id != 'system')}}).toArray()
rankList = rankList.map(i => ({...i, player: users.find(v => v.uid == i._id) || {}}))
// 活动结束前半小时缓存过期时间改为10秒
let exTime = (G.time + 1800) > _hd.etime ? 10 : 120
G.ioredis.setex(`rank:xiaofeijingsai`, exTime, JSON.stringify(rankList));
let myData = await getMyData(call, rankList, _hd)
call.succ({list: rankList, myData})
}
/**
* system占位
* @param rank
* @param list
*/
export function sortRankList(rank, list) {
let rankList = []
let ccc = 0
rank.map(i => {
for (let k = i.rank[0] - 1; k < i.rank[1]; k++) {
if (list[k]?.total >= i.need[0].n) {
rankList.push({...list[k - ccc], rank: k})
} else {
rankList.push({_id: 'system', total: i.need[0].n, rank: k, player: {}})
ccc += 1
}
}
})
return R.sort((a, b) => a.rank - b.rank)(rankList)
}
// 获取自己的信息
async function getMyData(call, rankList, _hd?) {
let myData = rankList.find(i => i._id == call.uid)
if (myData) return myData
if (!_hd) {
_hd = (await HuoDongFun.gethdList(call, 11))[0]
}
let myCut = (await G.mongodb.collection('rmbuse').aggregate([
{$match: {uid: call.uid, isAdd: false, cTime: {$gte: _hd.stime, $lte: _hd.etime}}},
{$group: {_id: "$uid", total: {$sum: "$change"}}}
]).toArray())[0]
let myUser = await G.mongodb.collection('user').findOne({uid: call.uid})
if (!myCut) {
myCut = {_id: myUser.uid, total: 0}
}
return {player: myUser, ...myCut, total: R.negate(myCut.total), rank: -1}
}

View File

@ -1,11 +1,12 @@
import { ApiCall } from "tsrpc"; import {ApiCall} from "tsrpc";
import { RedisCollections2 } from '../../module/redis'; import {RedisCollections2} from '../../module/redis';
import { ReqGetList, ResGetList } from "../../shared/protocols/hero/PtlGetList"; import {ReqGetList, ResGetList} from "../../shared/protocols/hero/PtlGetList";
import {PeijianShared} from "../../shared/public/peijian";
export default async function (call: ApiCall<ReqGetList, ResGetList>) { export default async function (call: ApiCall<ReqGetList, ResGetList>) {
let list: ResGetList['list'] = {}; let list: ResGetList['list'] = {};
//let kvList: k_v<RedisCollections2['hero']> = {}; //let kvList: k_v<RedisCollections2['hero']> = {};
let arrList = await G.mongodb.collection('hero').find({ uid: call.uid }).toArray(); let arrList = await G.mongodb.collection('hero').find({uid: call.uid}).toArray();
let heroCon = G.gc.hero; let heroCon = G.gc.hero;
let color = {}; let color = {};
@ -19,14 +20,47 @@ export default async function (call: ApiCall<ReqGetList, ResGetList>) {
if (!color[heroCon[v.heroId].colour]) color[heroCon[v.heroId].colour] = 0; if (!color[heroCon[v.heroId].colour]) color[heroCon[v.heroId].colour] = 0;
color[heroCon[v.heroId].colour] += 1; color[heroCon[v.heroId].colour] += 1;
}); });
// 修复配件数据
let peijianids = [];
Object.values(list).map(hero => {
hero.peijian && Object.values(hero.peijian).map(
i => peijianids.push(G.mongodb.conversionId(PeijianShared.fmt(i)._id))
)
});
let peijians = (await G.mongodb.collection("peijian").find(
{uid: call.uid, _id: {$in: peijianids}}, {projection: {_id: 1}}
).toArray()).map(temp => G.mongodb.conversionId(temp._id));
let changes = {};
Object.values(list).map(hero => {
for (let pos in hero.peijian) {
if (!peijians.includes(PeijianShared.fmt(hero.peijian[pos])._id)) {
hero.peijian[pos] = "";
changes[hero._id] = hero.peijian;
}
}
})
for (let oid in changes) {
// 修复数据
G.mongodb.collection("hero").updateOne(
G.mongodb.conversionIdObj({_id: oid}), {$set: {peijian: changes[oid]}}
)
}
// 记录玩家最大等级,颜色相关数据 注册任务用 // 记录玩家最大等级,颜色相关数据 注册任务用
await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({ uid: call.conn.uid, type: 'usertasklog' }, await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({uid: call.conn.uid, type: 'usertasklog'},
{ $set: { maxherolv: maxherolv, herocolor: color } }, { upsert: true }); {$set: {maxherolv: maxherolv, herocolor: color}}, {upsert: true});
//G.redis.set('hero', call.uid, kvList); //G.redis.set('hero', call.uid, kvList);
let recLshd = await G.mongodb.collection('playerInfo', 'lshd_hero').findOne({ uid: call.conn.uid, type: 'lshd_hero' }); let recLshd = await G.mongodb.collection('playerInfo', 'lshd_hero').findOne({
let { uid, _id, type, ...heros } = (recLshd || {}); uid: call.conn.uid,
type: 'lshd_hero'
});
let {uid, _id, type, ...heros} = (recLshd || {});
call.conn.lshd.hero = heros || {}; call.conn.lshd.hero = heros || {};
@ -34,6 +68,6 @@ export default async function (call: ApiCall<ReqGetList, ResGetList>) {
list: list, list: list,
pos: call.conn.heroPos, pos: call.conn.heroPos,
lshd: heros || {}, lshd: heros || {},
gbzj: (await G.mongodb.cPlayerInfo('gbzj').findOne({ uid: call.uid, type: 'gbzj' }))?.rec || {} gbzj: (await G.mongodb.cPlayerInfo('gbzj').findOne({uid: call.uid, type: 'gbzj'}))?.rec || {}
}); });
} }

View File

@ -15,11 +15,13 @@ import {md_redPoint} from '../gongyu/mingdao/ApiOpen';
import {HongDianFun, HuoDongHongDianFun} from "./fun"; import {HongDianFun, HuoDongHongDianFun} from "./fun";
import {FunWeiXiuChang} from "../../public/weixiuchang"; import {FunWeiXiuChang} from "../../public/weixiuchang";
import {getShouChongRedPoint} from "../event/shouchong/ApiReceive"; import {getShouChongRedPoint} from "../event/shouchong/ApiReceive";
import {LeiChongLiBaoGetHongDian} from "../event/leichonglibao/ApiReceive";
import { playerCanReceive } from '../event/payForDiamond/ApiCanReceive';
const defaultKeys: hongdianKey[] = ['jiuba', 'jiaotang', 'shouchong', 'clslhd', 'dixiaqianzhuanghd', 'gonghuihd', 'hbzbhd', 'jjchd', 'taskhd', const defaultKeys: hongdianKey[] = ['jiuba', 'jiaotang', 'shouchong', 'clslhd', 'dixiaqianzhuanghd', 'gonghuihd', 'hbzbhd', 'jjchd', 'taskhd',
'xstaskhd', 'lingzhulaixihd', 'dxlthd', 'wzcjhd', 'slzdhd', 'qjzzdhd', 'kuangdonghd', 'qiandaohd', 'kaifukuanghuanhd', 'jijinhd', 'zhuishalinghd', 'xstaskhd', 'lingzhulaixihd', 'dxlthd', 'wzcjhd', 'slzdhd', 'qjzzdhd', 'kuangdonghd', 'qiandaohd', 'kaifukuanghuanhd', 'jijinhd', 'zhuishalinghd',
'yibaichouhd', 'huobanzhaomuhd', 'qirileichonghd', 'jierihd', 'kbzzhd', 'wzryhd', 'yuedujijin', 'mingdao', 'patahd', 'yibaichouhd', 'huobanzhaomuhd', 'qirileichonghd', 'jierihd', 'kbzzhd', 'wzryhd', 'yuedujijin', 'mingdao', 'patahd',
'heishihd', 'huodonghd', 'renown', 'weixiuchang', 'kaifujingsai', 'zhoumolibao']; 'heishihd', 'huodonghd', 'renown', 'weixiuchang', 'kaifujingsai', 'zhoumolibao', 'pobinglibao', 'leichonglibao', 'payForDiamond'];
export default async function (call: ApiCall<ReqGet, ResGet>) { export default async function (call: ApiCall<ReqGet, ResGet>) {
@ -163,6 +165,13 @@ export default async function (call: ApiCall<ReqGet, ResGet>) {
case 'zhoumolibao': case 'zhoumolibao':
res[key] = await HongDianFun.zhoumolibao(call); res[key] = await HongDianFun.zhoumolibao(call);
break; break;
case "leichonglibao":
res[key] = await LeiChongLiBaoGetHongDian(call)
break;
case 'payForDiamond':
const receiveResult = await playerCanReceive(call, false);
res[key] = { show: receiveResult && receiveResult.result };
break;
} }
} }
} }

View File

@ -327,10 +327,7 @@ export class HuoDongHongDianFun {
hdxq: {} hdxq: {}
} }
}; };
let _hdList = [] let _hdList = await HuoDongFun.gethdList(call)
for (let i = 0; i < 8; i++) {
_hdList.push(...await HuoDongFun.gethdList(call, i + 1))
}
// let _hdList = await HuoDongFun.gethdList(call) // let _hdList = await HuoDongFun.gethdList(call)
for (let index = 0; index < _hdList.length; index++) { for (let index = 0; index < _hdList.length; index++) {
const element = _hdList[index]; const element = _hdList[index];
@ -368,6 +365,10 @@ export class HuoDongHongDianFun {
// 检测 htype 8 圣诞活动红点 // 检测 htype 8 圣诞活动红点
ishd = await this.christmasHongDian(call, element) ishd = await this.christmasHongDian(call, element)
} }
if (element.htype == 10) {
// 检测 htype 10 破冰活动红点
ishd = await this.pobinglibao(call, element)
}
// 此活动有红点 // 此活动有红点
if (ishd.show) { if (ishd.show) {
@ -380,6 +381,22 @@ export class HuoDongHongDianFun {
return _res; return _res;
} }
/**破冰礼包红点 */
static async pobinglibao(call: ApiCall, _hd: ReqAddHuoDong): Promise<hongdianVal> {
let gift = _hd?.data?.gift?.find(i => i.id == call.req.id)
if (!gift) return {show: false}
let payLog = await PayFun.getPayLog(call.uid, gift.payId)
payLog = payLog?.filter(i => i.time >= _hd.stime && i.time <= _hd.etime) || []
if (!payLog || !payLog.length) return {show: false}
// 取奖励列表,判断是否有可领取奖励
let data = await G.mongodb.cEvent('pobinglibao').findOne({uid: call.uid, type: 'pobinglibao'})
let rec = data?.record?.[call.req.id].length
if (rec && (rec >= 3 || data?.record?.[gift.id] == call.req.recId)) return {show: false}
return {show: true}
}
/**开服狂欢红点 */ /**开服狂欢红点 */
static async kfkhHongDian(call: ApiCall) { static async kfkhHongDian(call: ApiCall) {
let _res: hongdianVal = { let _res: hongdianVal = {

View File

@ -9,6 +9,7 @@ import {ReqLottery, ResLottery} from "../../shared/protocols/jiuba/PtlLottery";
import {PublicShared} from '../../shared/public/public'; import {PublicShared} from '../../shared/public/public';
import {HongDianChange} from '../hongdian/fun'; import {HongDianChange} from '../hongdian/fun';
import {RankKfjs} from "../../public/rank/rank_kfjs"; import {RankKfjs} from "../../public/rank/rank_kfjs";
import {PushGiftFun} from "../../public/pushgift";
export default async function (call: ApiCall<ReqLottery, ResLottery>) { export default async function (call: ApiCall<ReqLottery, ResLottery>) {
@ -142,4 +143,8 @@ export default async function (call: ApiCall<ReqLottery, ResLottery>) {
valArr: [await rankKfjs.getRankScore(call.uid) + call.req.type] valArr: [await rankKfjs.getRankScore(call.uid) + call.req.type]
}); });
// 十连抽推送礼包
if (call.req.type == 10) {
PushGiftFun.chkRecruitGift(call.uid)
}
} }

View File

@ -0,0 +1,9 @@
import {ApiCall} from "tsrpc";
import {ReqItemNoEnough, ResItemNoEnough} from "../../shared/protocols/pushgift/PtlItemNoEnough";
import {PushGiftFun} from "../../public/pushgift";
export default async function (call: ApiCall<ReqItemNoEnough, ResItemNoEnough>) {
// 物品不足 前端拦截的 通知后端 检测推送礼包
PushGiftFun.chkItemGift(call.uid, {a: call.req.need.a, t: call.req.need.t, n: 0})
call.succ({})
}

View File

@ -0,0 +1,30 @@
import {ApiCall} from "tsrpc";
import {ReqOpen, ResOpen} from "../../shared/protocols/pushgift/PtlOpen";
import {PushGiftFun} from "../../public/pushgift";
import {Gift} from "../../module/collection_pushgift";
export default async function (call: ApiCall<ReqOpen, ResOpen>) {
let res: ResOpen = {gifts: []};
// 过滤过期的礼包 和购买完毕的礼包
(await PushGiftFun.getGift(call.uid)).forEach((gift) => {
if (gift.passTime > G.time && chkBuyNum(gift.id, gift)) {
res.gifts.push(gift)
}
})
call.succ(res)
}
function chkBuyNum(gift_id: string, gift_info: Gift) {
let conf = G.gc.tuisonglibao[gift_id];
for (let i = 0; i < conf.payId.length; i++) {
let pay = G.gc.pay[conf.payId[i]];
let buy = gift_info.buy.map(i => i != 0);
if (pay.buys > 0 && gift_info.buy[i] < pay.buys) {
return true
}
}
return false
}

View File

@ -0,0 +1,10 @@
import {ApiCall} from "tsrpc";
import {ReqDot, ResDot} from "../../shared/protocols/user/PtlDot";
import {addGameDot} from "../../gameLog";
export default async function (call: ApiCall<ReqDot, ResDot>) {
addGameDot(call.uid, call.req.type, call.req.data)
call.succ({});
}

View File

@ -132,6 +132,9 @@ async function doLogin(call: ApiCall<ReqLogin, ResLogin>) {
//await G.redis.set('user', gud.uid, gud); //await G.redis.set('user', gud.uid, gud);
await initGud(gud.uid, gud); await initGud(gud.uid, gud);
// 修复公会id
await fixUnionData(gud);
//记录玩家所在的进程change: 更换到处理完踢线操作在写入。 //记录玩家所在的进程change: 更换到处理完踢线操作在写入。
// setUidProcessId(gud.uid); // setUidProcessId(gud.uid);
@ -278,4 +281,19 @@ async function LoginFun(call: ApiCall<ReqLogin, ResLogin>) {
// //
// G.mongodb.collection("hero").findOneAndUpdate({_id: i._id}, {$set: {shiwu: shiwuChange}}) // G.mongodb.collection("hero").findOneAndUpdate({_id: i._id}, {$set: {shiwu: shiwuChange}})
// }) // })
// } // }
// 修复玩家退出公会 但是gud中残留公会id
async function fixUnionData(gud: ResLogin["gud"]) {
if (gud.ghId) {
let ghdata = await G.mongodb.collection("gonghui").findOne(
{_id: G.mongodb.conversionId(gud.ghId), 'players.uid': gud.uid}
)
if (!ghdata) {
gud.ghId = "";
gud.ghName = "";
gud.ghLevel = 0;
PlayerFun.changeAttr(gud.uid, {ghId: '', ghLevel: 0})
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
import {ctor} from "../global";
import {initMongoDB} from "../setMongodb";
async function start() {
await initMongoDB()
let datas = await G.mongodb.collection("event").find(
{type: {$in: ["yangchengmubiao100", "yangchengmubiao101"]}}
).toArray();
for (let i = 0; i < datas.length; i++) {
let add = 0;
let data = datas[i];
if (!Array.isArray(data.taskval)) continue;
let taskval: { [taskid: string]: number } = {};
for (let i = 0; i < data.taskval.length; i++) {
if (data.taskval[i] === null) continue;
if (typeof data.taskval[i] == "number") {
add = data.taskval[i];
} else {
taskval = Object.assign(taskval, data.taskval[i]);
}
}
for (let taskid in taskval) {
taskval[taskid] = (taskval[taskid] || 0) + add;
}
await G.mongodb.collection("event").updateOne(
{uid: data.uid, type: data.type}, {$set: {taskval: taskval}}
)
console.log(`修复玩家${data.uid}人才计划数据完成...`);
}
}
ctor();
start().then(() => {
setInterval(() => {
console.log(new Date().format("MM-dd hh:mm:ss"));
}, 1000)
console.log("逻辑执行完成...等待退出!!!");
});

View File

@ -1,6 +1,6 @@
import {ctor} from "./global"; import {ctor} from "../global";
import {initMongoDB} from "./setMongodb"; import {initMongoDB} from "../setMongodb";
import {yangchengmubiao} from "./shared/protocols/event/yangchengmubiao/PtlOpen"; import {yangchengmubiao} from "../shared/protocols/event/yangchengmubiao/PtlOpen";
async function start() { async function start() {
await initMongoDB() await initMongoDB()

View File

@ -0,0 +1,126 @@
import {ctor} from "../global";
import {initMongoDB} from "../setMongodb";
import {yangchengmubiao} from "../shared/protocols/event/yangchengmubiao/PtlOpen";
import {number} from "mathjs";
import {PublicShared} from "../shared/public/public";
async function start() {
await initMongoDB()
const task = {
'2001': {
'prize': [{'a': 'item', 't': '4', 'n': 5}, {'a': 'item', 't': '626', 'n': 10}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 50,
'cond': [],
'stype': 118
},
'2002': {
'prize': [{'a': 'item', 't': '4', 'n': 5}, {'a': 'item', 't': '626', 'n': 10}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 100,
'cond': [],
'stype': 118
},
'2003': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '626', 'n': 20}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 200,
'cond': [],
'stype': 118
},
'2004': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '600', 'n': 20}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 250,
'cond': [],
'stype': 118
},
'2005': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '600', 'n': 20}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 300,
'cond': [],
'stype': 118
},
'2006': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '619', 'n': 1}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 400,
'cond': [],
'stype': 118
},
'2007': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '619', 'n': 1}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 500,
'cond': [],
'stype': 118
}
};
let hdid = [100, 101];
let openday = PublicShared.getOpenServerDay();
let openhdlist = await G.mongodb.collection("hdinfo").find(
{hdid: {$in: hdid}, stime: {$lte: openday}, etime: {$gte: openday}}
).toArray();
// 没有开启的活动 返回
if (openhdlist.length <= 0) {
return;
} else {
hdid = openhdlist.map(hd => hd.hdid);
}
let datas: yangchengmubiao[];
datas = await G.mongodb.cEvent(`yangchengmubiao${hdid[0]}`).find(
{type: `yangchengmubiao${hdid[0]}`}
).toArray();
for (let i = 0; i < datas.length; i++) {
let data = datas[i];
let finishid = new Set(data.finishid["2"]);
// 查找任务未完成 但设置了领奖标识
for (let taskid in task) {
let con = task[taskid];
let taskval = data.taskval || {};
if (finishid.has(number(taskid)) && (taskval[taskid] || 0) < con.pval) {
finishid.delete(number(taskid));
}
}
// 没有删除的
if (finishid.size == data.finishid["2"].length) {
continue
}
await G.mongodb.collection("event").updateOne(
{"uid": data.uid, "type": data.type}, {$set: {"finishid.2": [...finishid]}}
)
console.log(`修复玩家${data.uid}人才计划${data.type}数据完成...`);
}
}
ctor();
start().then(() => {
let s = 0;
setInterval(() => {
s += 1;
console.log(new Date().format("MM-dd hh:mm:ss"));
if (s >= 3) process.exit(1);
}, 1000)
console.log("逻辑执行完成...等待退出!!!");
});

View File

@ -0,0 +1,98 @@
import {ctor} from "../global";
import {_mongodb} from "../setMongodb";
import {MongoClient} from "mongodb";
async function initMongoDB() {
console.log('connect mongodb ......');
let client = await MongoClient.connect(G.config.mongodbUrl);
G.mongodb = new _mongodb(client.db(G.config.dbName || ''));
console.log('connect mongodb succ');
}
async function start() {
await initMongoDB()
const task = {
'2001': {
'prize': [{'a': 'item', 't': '4', 'n': 5}, {'a': 'item', 't': '626', 'n': 10}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 50,
'cond': [],
'stype': 118
},
'2002': {
'prize': [{'a': 'item', 't': '4', 'n': 5}, {'a': 'item', 't': '626', 'n': 10}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 100,
'cond': [],
'stype': 118
},
'2003': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '626', 'n': 20}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 200,
'cond': [],
'stype': 118
},
'2004': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '600', 'n': 20}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 250,
'cond': [],
'stype': 118
},
'2005': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '600', 'n': 20}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 300,
'cond': [],
'stype': 118
},
'2006': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '619', 'n': 1}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 400,
'cond': [],
'stype': 118
},
'2007': {
'prize': [{'a': 'item', 't': '4', 'n': 10}, {'a': 'item', 't': '619', 'n': 1}],
'tujing': '',
'title': 'intr_yczm_day_des_2',
'type': 2,
'pval': 500,
'cond': [],
'stype': 118
}
};
let hdid = [100, 101];
await G.mongodb.collection("hdinfo").updateMany(
{hdid: {$in: hdid}}, {$set: {"data.tasklist.2": task}}
)
console.log(`修复区服${G.config.serverId}人才计划活动数据完成...`);
}
ctor();
start().then(() => {
let s = 0;
setInterval(() => {
s += 1;
console.log(new Date().format("MM-dd hh:mm:ss"));
if (s >= 3) process.exit(1);
}, 1000)
console.log("逻辑执行完成...等待退出!!!");
});

View File

@ -0,0 +1,22 @@
import {initMongoDB} from "../setMongodb";
import {ctor} from "../global";
async function start() {
await initMongoDB();
let emails = await G.mongodb.collection("email").find({
title: {$regex: "wzry"}
}).toArray();
for (let i = 0; i < emails.length; i++) {
console.log();
}
}
ctor();
start().then(() => {
setInterval(() => {
console.log(new Date().format("MM-dd hh:mm:ss"));
}, 1000)
console.log("逻辑执行完成...等待退出!!!");
});

View File

@ -1,5 +1,5 @@
import {ctor} from './global'; import {ctor} from '../global';
import {initMongoDB} from './setMongodb'; import {initMongoDB} from '../setMongodb';
async function start() { async function start() {
//连接mongodb //连接mongodb

View File

@ -1,5 +1,5 @@
import {ctor} from "./global"; import {ctor} from "../global";
import {initMongoDB} from "./setMongodb"; import {initMongoDB} from "../setMongodb";
async function start() { async function start() {
await initMongoDB() await initMongoDB()

View File

@ -0,0 +1,47 @@
import fs from "fs";
import {MongoClient} from "mongodb";
async function start() {
let mongodbUrl = "mongodb://blacklagoon:lffu2bD%5eGn2%5eE%2bE7@blacklagoon-mongo-secondary.pro.g123-cpp.com:3717,blacklagoon-mongo-primary.pro.g123-cpp.com:3717?replicaSet=mgset-351738825"
//连接mongodb
let client = await MongoClient.connect(mongodbUrl);
console.log('链接成功');
let user2email: { [uid: string]: { [title: string]: { prize: any, get_num: number, unget_num: number } } } = {};
for (let i = 1; i < 49; i++) {
let dbName = `blacklagoon_s${i}`
console.log(dbName)
let mongodb = client.db(dbName);
let emails = await mongodb.collection("email").find({
title: {$regex: "wzry"}
}).toArray();
for (let i = 0; i < emails.length; i++) {
let email = emails[i];
if (!email.prizeData?.prize) continue;
if (!user2email[email.uid]) {
user2email[email.uid] = {};
}
if (!user2email[email.uid][email.title]) {
user2email[email.uid][email.title] = {
prize: email.prizeData.prize,
get_num: 0,
unget_num: 0,
}
}
if (email.prizeData.isGet) {
user2email[email.uid][email.title].get_num += 1;
} else {
user2email[email.uid][email.title].unget_num += 1;
}
}
}
fs.writeFileSync('email.json', JSON.stringify(user2email, null, 2))
}
start().then(() => {
process.exit()
});

View File

@ -1,6 +1,6 @@
import {ctor} from './global'; import {ctor} from '../global';
import {initMongoDB} from './setMongodb'; import {initMongoDB} from '../setMongodb';
import {initRedis} from './setRedis'; import {initRedis} from '../setRedis';
async function start() { async function start() {
//连接mongodb //连接mongodb

View File

@ -43,4 +43,30 @@ export async function addGameLog(uid:string, type:string, req:any, data:any){
}catch(e){ }catch(e){
console.error('addGameLog',e); console.error('addGameLog',e);
} }
}
/**
*
* @param uid uid
* @param type
* @param data
*/
export async function addGameDot(uid:string, type:string, data?:any){
try{
if(!logDB){
await connGameLogDB();
}
let log = {
uid,
type,
data
}
//事件时间
log['cTime'] = Math.floor(Date.now()/1000);
logDB.collection('gameDot').insertOne(log);
}catch(e){
console.error('addGameLog',e);
}
} }

View File

@ -92,6 +92,8 @@ class _G {
redis: redisJsonFun; redis: redisJsonFun;
/**ioredis连接对象 */ /**ioredis连接对象 */
ioredis: Redis; ioredis: Redis;
/** 跨服 ioredis 连接对象 */
iorediscross: Redis;
/**mongodb连接对象 */ /**mongodb连接对象 */
mongodb: _mongodb; mongodb: _mongodb;
/**crossmongodb连接对象 */ /**crossmongodb连接对象 */

View File

@ -17,6 +17,8 @@ import { PublicShared } from './shared/public/public';
import { setGud } from './public/gud'; import { setGud } from './public/gud';
import {checkResetBuyLog} from "./api_s2c/event/zhoumolibao/ApiOpen"; import {checkResetBuyLog} from "./api_s2c/event/zhoumolibao/ApiOpen";
import {Christmasfun} from "./api_s2c/event/christmas/fun"; import {Christmasfun} from "./api_s2c/event/christmas/fun";
import {PushGiftFun} from "./public/pushgift";
import {LeiChongLiBaoBuyGift} from "./api_s2c/event/leichonglibao/ApiReceive";
export type gEventType = { export type gEventType = {
/**玩家断开连接 */ /**玩家断开连接 */
@ -200,6 +202,8 @@ export function addListener() {
{ $inc: { payNum: conf.money } }, { $inc: { payNum: conf.money } },
{ upsert: true } { upsert: true }
); );
await PushGiftFun.buy(player.uid, payId) // 推送礼包
await LeiChongLiBaoBuyGift(call, payId) // 累充礼包
}); });
G.on("FIRST_LOGIN_EVERY_DAY", (gud, lastTime, curTime) => { G.on("FIRST_LOGIN_EVERY_DAY", (gud, lastTime, curTime) => {

View File

@ -16,4 +16,7 @@ export async function initIORedis() {
G.ioredis = new Redis(G.argv.serverType == 'cross' ? G.config.crossRedisUrl : G.config.redisUrl,{ G.ioredis = new Redis(G.argv.serverType == 'cross' ? G.config.crossRedisUrl : G.config.redisUrl,{
keyPrefix: preKey, keyPrefix: preKey,
}); });
} G.iorediscross = new Redis(G.config.crossRedisUrl,{
keyPrefix: "cross_",
});
}

View File

@ -122,11 +122,21 @@
"shengdanBullet": { "shengdanBullet": {
"id": "shengdanBullet", "id": "shengdanBullet",
"name": "intr_attr_name_14", "name": "intr_attr_name_14",
"undefined": "圣诞子弹", "undefined": "圣诞打靶币",
"colour": 5, "colour": 5,
"icon": "icon_chegaipq", "icon": "icon_chegaipq",
"sicon": "icon_chegaipq", "sicon": "icon_chegaipq",
"describe": "intr_attr_describe_14", "describe": "intr_attr_describe_14",
"advancedEffects": "ani_xiangzikuang" "advancedEffects": "ani_xiangzikuang"
},
"jingxuanbi": {
"id": "jingxuanbi",
"name": "intr_attr_name_15",
"undefined": "每日精选兑换币",
"colour": 4,
"icon": "icon_hspj",
"sicon": "icon_hspj",
"describe": "intr_attr_describe_15",
"advancedEffects": ""
} }
} }

View File

@ -33,10 +33,9 @@
}, },
//136礼包 //136礼包
'136Gift': [ '136Gift': [
{ payId: '136Gift1', prize: [] },
{ prize: [{"a": "attr", "t": "rmbmoney", "n": 10},{"a": "item", "t": "12", "n": 10},{"a": "attr", "t": "jinbi", "n": 10000}] }, { prize: [{"a": "attr", "t": "rmbmoney", "n": 10},{"a": "item", "t": "12", "n": 10},{"a": "attr", "t": "jinbi", "n": 10000}] },
{ payId: '136Gift2', prize: [] }, { payId: '136Gift2', prize: [], bonus: [{"a": "attr", "t": "jingxuanbi", "n": 10}] },
{ payId: '136Gift3', prize: [] }, { payId: '136Gift3', prize: [], bonus: [{"a": "attr", "t": "jingxuanbi", "n": 10}] },
{ payId: '136Gift4', prize: [] }, { payId: '136Gift4', prize: [], bonus: [{"a": "attr", "t": "jingxuanbi", "n": 10}] },
], ],
} }

View File

@ -122,6 +122,88 @@
"ARS": 110, "ARS": 110,
"MOP": 8.99 "MOP": 8.99
}, },
"8": {
"CNY": 8,
"JPY": 160,
"USD": 1.49,
"AUD": 2.09,
"GBP": 1.09,
"CAD": 1.99,
"TWD": 40,
"EUR": 1.29,
"CHF": 1.49,
"CZK": 31,
"DKK": 9.09,
"HKD": 12,
"HUF": 470,
"NOK": 12.49,
"NZD": 2.09,
"PLN": 5.49,
"SEK": 12.99,
"SGD": 1.89,
"THB": 46.99,
"PHP": 72.99,
"MXN": 30.99,
"ILS": 4.79,
"RUB": 107.99,
"KRW": 1710,
"VND": 33600,
"IDR": 20900,
"CLP": 1150,
"MYR": 6.09,
"BRL": 7.49,
"AED": 5.49,
"BDT": 121.99,
"PEN": 5.99,
"RON": 6.09,
"SAR": 5.49,
"INR": 106.99,
"ISK": 190,
"BGN": 2.49,
"ARS": 320,
"MOP": 11.99
},
"10": {
"CNY": 10,
"JPY": 200,
"USD": 1.79,
"AUD": 2.69,
"GBP": 1.49,
"CAD": 2.39,
"TWD": 50,
"EUR": 1.59,
"CHF": 1.79,
"CZK": 38,
"DKK": 11.49,
"HKD": 14,
"HUF": 580,
"NOK": 15.99,
"NZD": 2.69,
"PLN": 6.99,
"SEK": 16.09,
"SGD": 2.29,
"THB": 58.99,
"PHP": 90.99,
"MXN": 38.99,
"ILS": 6.09,
"RUB": 134.99,
"KRW": 2130,
"VND": 41900,
"IDR": 26100,
"CLP": 1430,
"MYR": 7.49,
"BRL": 9.49,
"AED": 6.49,
"BDT": 152.99,
"PEN": 7.49,
"RON": 7.49,
"SAR": 6.99,
"INR": 133.99,
"ISK": 230,
"BGN": 3.09,
"ARS": 400,
"MOP": 14.99
},
"12": { "12": {
"CNY": 12, "CNY": 12,
"JPY": 240, "JPY": 240,

View File

@ -2582,6 +2582,90 @@
"rarity": 4 "rarity": 4
} }
}, },
"item^634": {
"itemId": "item^634",
"name": "紫橙干部碎片随机箱",
"i18nKey": "intr_item_name_634",
"detailI18nKey": "intr_item_describe_634",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 5
}
},
"item^635": {
"itemId": "item^635",
"name": "紫橙装备碎片随机箱",
"i18nKey": "intr_item_name_635",
"detailI18nKey": "intr_item_describe_635",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 120,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 5
}
},
"item^636": {
"itemId": "item^636",
"name": "紫橙红干部碎片随机箱",
"i18nKey": "intr_item_name_636",
"detailI18nKey": "intr_item_describe_636",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 244,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 5
}
},
"item^637": {
"itemId": "item^637",
"name": "超级红色干部自选箱",
"i18nKey": "intr_item_name_637",
"detailI18nKey": "intr_item_describe_637",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 30000,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 6
}
},
"item^5001": { "item^5001": {
"itemId": "item^5001", "itemId": "item^5001",
"name": "莱薇碎片", "name": "莱薇碎片",
@ -6845,6 +6929,489 @@
"rarity": 2 "rarity": 2
} }
}, },
"item^50001": {
"itemId": "item^50001",
"name": "火力覆盖",
"i18nKey": "playerheadFrame_name_3",
"detailI18nKey": "intr_item_describe_50001",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50002": {
"itemId": "item^50002",
"name": "双枪",
"i18nKey": "playerheadFrame_name_4",
"detailI18nKey": "intr_item_describe_50002",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50003": {
"itemId": "item^50003",
"name": "武装炫耀",
"i18nKey": "playerheadFrame_name_6",
"detailI18nKey": "intr_item_describe_50003",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50004": {
"itemId": "item^50004",
"name": "血海",
"i18nKey": "playerheadFrame_name_7",
"detailI18nKey": "intr_item_describe_50004",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50005": {
"itemId": "item^50005",
"name": "破笼而出",
"i18nKey": "playerheadFrame_name_8",
"detailI18nKey": "intr_item_describe_50005",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50006": {
"itemId": "item^50006",
"name": "擂台",
"i18nKey": "playerheadFrame_name_9",
"detailI18nKey": "intr_item_describe_50006",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50007": {
"itemId": "item^50007",
"name": "破土而出",
"i18nKey": "playerheadFrame_name_10",
"detailI18nKey": "intr_item_describe_50007",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50008": {
"itemId": "item^50008",
"name": "赠礼",
"i18nKey": "playerheadFrame_name_11",
"detailI18nKey": "intr_item_describe_50008",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50009": {
"itemId": "item^50009",
"name": "圣诞氛围",
"i18nKey": "playerheadFrame_name_23",
"detailI18nKey": "intr_item_describe_50009",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50010": {
"itemId": "item^50010",
"name": "披星戴月",
"i18nKey": "playerheadFrame_name_24",
"detailI18nKey": "intr_item_describe_50010",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50101": {
"itemId": "item^50101",
"name": "冰天雪地",
"i18nKey": "playerChatFrame_name_6",
"detailI18nKey": "intr_item_describe_50101",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50102": {
"itemId": "item^50102",
"name": "海浪奔涌",
"i18nKey": "playerChatFrame_name_7",
"detailI18nKey": "intr_item_describe_50102",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50103": {
"itemId": "item^50103",
"name": "名扬四海",
"i18nKey": "playerheadFrame_name_15",
"detailI18nKey": "intr_item_describe_50103",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50104": {
"itemId": "item^50104",
"name": "圣诞快乐",
"i18nKey": "playerChatFrame_name_8",
"detailI18nKey": "intr_item_describe_50104",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50201": {
"itemId": "item^50201",
"name": "招贤纳士",
"i18nKey": "playerheadFrame_name_16",
"detailI18nKey": "intr_item_describe_50201",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50202": {
"itemId": "item^50202",
"name": "势如破竹",
"i18nKey": "playerheadFrame_name_17",
"detailI18nKey": "intr_item_describe_50202",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50203": {
"itemId": "item^50203",
"name": "被甲执兵",
"i18nKey": "playerheadFrame_name_18",
"detailI18nKey": "intr_item_describe_50203",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50204": {
"itemId": "item^50204",
"name": "锋芒毕露",
"i18nKey": "playerheadFrame_name_19",
"detailI18nKey": "intr_item_describe_50204",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50205": {
"itemId": "item^50205",
"name": "所向披靡",
"i18nKey": "playerheadFrame_name_20",
"detailI18nKey": "intr_item_describe_50205",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50206": {
"itemId": "item^50206",
"name": "传世藏品",
"i18nKey": "playerheadFrame_name_21",
"detailI18nKey": "intr_item_describe_50206",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50207": {
"itemId": "item^50207",
"name": "金戈铁马",
"i18nKey": "playerheadFrame_name_22",
"detailI18nKey": "intr_item_describe_50207",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"item^50301": {
"itemId": "item^50301",
"name": "圣诞庆典:男",
"i18nKey": "playerModel_name_3",
"detailI18nKey": "intr_item_describe_50301",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 5
}
},
"item^50302": {
"itemId": "item^50302",
"name": "圣诞庆典:女",
"i18nKey": "playerModel_name_4",
"detailI18nKey": "intr_item_describe_50302",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "item",
"typeName": "道具",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 5
}
},
"equip^1001": { "equip^1001": {
"itemId": "equip^1001", "itemId": "equip^1001",
"name": "棉布头盔", "name": "棉布头盔",
@ -10015,5 +10582,152 @@
"sellMaxCp": 500, "sellMaxCp": 500,
"rarity": 3 "rarity": 3
} }
},
"attr^nexp": {
"itemId": "attr^nexp",
"name": "主角经验",
"i18nKey": "intr_attr_name_3",
"detailI18nKey": "intr_attr_describe_3",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "attr",
"typeName": "货币",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"attr^rongyu": {
"itemId": "attr^rongyu",
"name": "荣誉勋章",
"i18nKey": "intr_attr_name_4",
"detailI18nKey": "intr_attr_describe_4",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "attr",
"typeName": "货币",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
},
"attr^payExp": {
"itemId": "attr^payExp",
"name": "VIP经验",
"i18nKey": "intr_attr_name_5",
"detailI18nKey": "intr_attr_describe_5",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "attr",
"typeName": "货币",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 5
}
},
"attr^guijinshu": {
"itemId": "attr^guijinshu",
"name": "贵金属",
"i18nKey": "intr_attr_name_6",
"detailI18nKey": "intr_attr_describe_6",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "attr",
"typeName": "货币",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 3
}
},
"attr^shengdanExp": {
"itemId": "attr^shengdanExp",
"name": "圣诞战令经验",
"i18nKey": "intr_attr_name_13",
"detailI18nKey": "intr_attr_describe_13",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "attr",
"typeName": "货币",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 5
}
},
"attr^shengdanBullet": {
"itemId": "attr^shengdanBullet",
"name": "圣诞打靶币",
"i18nKey": "intr_attr_name_14",
"detailI18nKey": "intr_attr_describe_14",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "attr",
"typeName": "货币",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 5
}
},
"attr^jingxuanbi": {
"itemId": "attr^jingxuanbi",
"name": "每日精选兑换币",
"i18nKey": "intr_attr_name_15",
"detailI18nKey": "intr_attr_describe_15",
"iconUrl": "https://ik.imagekit.io/g123/production-ctw-box/game-box/preview/6ffd84658d75d5247f7f01b2f00ae3e6beda7163237c025ff8f0a58c.png",
"value": 0,
"typeId": "attr",
"typeName": "货币",
"isStoreSupported": true,
"isAiSupported": true,
"attributes": {
"storeDisplayPrice": null,
"storeCategory": "",
"setQuantity": 1,
"purchaseLimit": 0,
"sellMinCp": 100,
"sellMaxCp": 500,
"rarity": 4
}
} }
} }

View File

@ -3978,7 +3978,7 @@
"hdid" : 11000, // 唯一活动id 消费竞赛 "hdid" : 11000, // 唯一活动id 消费竞赛
"htype" : 11, // 后端唯一识别标识 "htype" : 11, // 后端唯一识别标识
"stype" : 1100, // 前端唯一识别标识(看前端需要是否修改) "stype" : 1100, // 前端唯一识别标识(看前端需要是否修改)
"ttype" : 0, // 0 按照开服时间计算1 玩家注册时间计算 4 屏蔽此活动 "ttype" : 4, // 0 按照开服时间计算1 玩家注册时间计算 4 屏蔽此活动
"stime" : 0, // 活动开始天数 "stime" : 0, // 活动开始天数
"rtime" : 30, // 活动显示结束天数 "rtime" : 30, // 活动显示结束天数
"etime" : 30, // 活动实际结束 "etime" : 30, // 活动实际结束
@ -3988,27 +3988,31 @@
"data" : { "data" : {
//活动文本描述 //活动文本描述
intr: "xfjstips_1", intr: "xfjstips_1",
intr: "xfjstips_2", intr2: "xfjstips_2",
//排名 //奖励邮件标题
mailTitle: "intr_xfjs_mailTitle",
//奖励邮件内容
mailDes: "intr_xfjs_mailDes",
//排名
rank: [ rank: [
{ {
id: '1', id: '1',
name: 'xfjstips_3', name: 'xfjstips_3',
rank:[1], rank:[1,1],
need: [{'a': 'attr', 't': 'rmbmoney', 'n': 20000}], need: [{'a': 'attr', 't': 'rmbmoney', 'n': 20000}],
prize: [{'a': 'item', 't': '13', 'n': 600}] prize: [{'a': 'item', 't': '13', 'n': 600}]
}, },
{ {
id: '2', id: '2',
name: 'xfjstips_4', name: 'xfjstips_4',
rank:[2], rank:[2,2],
need: [{'a': 'attr', 't': 'rmbmoney', 'n': 18000}], need: [{'a': 'attr', 't': 'rmbmoney', 'n': 18000}],
prize: [{'a': 'item', 't': '13', 'n': 600}] prize: [{'a': 'item', 't': '13', 'n': 600}]
}, },
{ {
id: '3', id: '3',
name: 'xfjstips_5', name: 'xfjstips_5',
rank:[3], rank:[3,3],
need: [{'a': 'attr', 't': 'rmbmoney', 'n': 16000}], need: [{'a': 'attr', 't': 'rmbmoney', 'n': 16000}],
prize: [{'a': 'item', 't': '13', 'n': 600}] prize: [{'a': 'item', 't': '13', 'n': 600}]
}, },
@ -4025,6 +4029,13 @@
rank:[11,30], rank:[11,30],
need: [{'a': 'attr', 't': 'rmbmoney', 'n': 12000}], need: [{'a': 'attr', 't': 'rmbmoney', 'n': 12000}],
prize: [{'a': 'item', 't': '13', 'n': 600}] prize: [{'a': 'item', 't': '13', 'n': 600}]
},
{
id: '6',
name: 'xfjstips_8',
rank:[31,9999],
need: [{'a': 'attr', 't': 'rmbmoney', 'n': 12000}],
prize: [{'a': 'item', 't': '13', 'n': 600}]
} }
] ]
} }
@ -4033,7 +4044,7 @@
"hdid" : 12000, // 唯一活动id 累计购买礼包 "hdid" : 12000, // 唯一活动id 累计购买礼包
"htype" : 12, // 后端唯一识别标识 "htype" : 12, // 后端唯一识别标识
"stype" : 1200, // 前端唯一识别标识(看前端需要是否修改) "stype" : 1200, // 前端唯一识别标识(看前端需要是否修改)
"ttype" : 0, // 0 按照开服时间计算1 玩家注册时间计算 4 屏蔽此活动 "ttype" : 4, // 0 按照开服时间计算1 玩家注册时间计算 4 屏蔽此活动
"stime" : 0, // 活动开始天数 "stime" : 0, // 活动开始天数
"rtime" : 30, // 活动显示结束天数 "rtime" : 30, // 活动显示结束天数
"etime" : 30, // 活动实际结束 "etime" : 30, // 活动实际结束
@ -4041,17 +4052,14 @@
"icon": "icon_ljlibao", "icon": "icon_ljlibao",
"showtime" : "仅供参考,会复写正确值", // 自选礼包,如果存在多个活动,计费点不要设置一样;如果是一样,可能会存在付费一次,购买多次。 "showtime" : "仅供参考,会复写正确值", // 自选礼包,如果存在多个活动,计费点不要设置一样;如果是一样,可能会存在付费一次,购买多次。
"data" : { "data" : {
//活动文本描述
intr: "ljlibaotips_1",
intr: "ljlibaotips_2",
//礼包 //礼包
gift: [ gift: [
{ {
id: '1', id: '1',
name: 'ljlibaotips_3', need:[],
need:[],
free: false, free: false,
payId: 'ljlibao_1', payId: 'ljlibao_1',
//返利比
scale: 200, scale: 200,
buynum: 1, buynum: 1,
prize:[ prize:[
@ -4064,7 +4072,6 @@
}, },
{ {
id: '2', id: '2',
name: 'ljlibaotips_4',
need:[], need:[],
free: false, free: false,
payId: 'ljlibao_2', payId: 'ljlibao_2',
@ -4080,7 +4087,6 @@
}, },
{ {
id: '3', id: '3',
name: 'ljlibaotips_5',
need:[], need:[],
free: false, free: false,
payId: 'ljlibao_3', payId: 'ljlibao_3',
@ -4096,7 +4102,6 @@
}, },
{ {
id: '4', id: '4',
name: 'ljlibaotips_6',
need:[], need:[],
free: false, free: false,
payId: 'ljlibao_4', payId: 'ljlibao_4',
@ -4117,7 +4122,6 @@
}, },
{ {
id: '5', id: '5',
name: 'ljlibaotips_7',
need:[], need:[],
free: false, free: false,
payId: 'ljlibao_5', payId: 'ljlibao_5',
@ -4138,7 +4142,6 @@
}, },
{ {
id: '6', id: '6',
name: 'ljlibaotips_8',
need:[], need:[],
free: false, free: false,
payId: 'ljlibao_6', payId: 'ljlibao_6',
@ -4159,7 +4162,6 @@
}, },
{ {
id: '7', id: '7',
name: 'ljlibaotips_9',
need:[], need:[],
free: false, free: false,
payId: 'ljlibao_7', payId: 'ljlibao_7',
@ -4179,7 +4181,11 @@
] ]
}, },
], ],
//买X次可以领大奖
payRewardNum: 5,
//自选框掉落池 //自选框掉落池
//配几组就显示有几个格子
//配置的是可选的道具
dlz: [ dlz: [
{ {
"1": {"a": "item", "t":"600", "n": 20}, "1": {"a": "item", "t":"600", "n": 20},
@ -4224,5 +4230,58 @@
} }
] ]
} }
},
{
"hdid" : 13000, // 唯一活动id 充值分红包
"htype" : 13, // 后端唯一识别标识
"stype" : 1300, // 前端唯一识别标识(看前端需要是否修改)
"ttype" : 4, // 0 按照开服时间计算1 玩家注册时间计算 4 屏蔽此活动
"stime" : 0, // 活动开始天数
"rtime" : 30, // 活动显示结束天数
"etime" : 30, // 活动实际结束
"name": "fenhongbao",
"icon": "icon_fenhongbao",
"showtime" : "仅供参考,会复写正确值", // 自选礼包,如果存在多个活动,计费点不要设置一样;如果是一样,可能会存在付费一次,购买多次。
"data" : {
//活动文本描述
intr: "zuanshihongbao_5",
//分红包所需最低钻石数
price: 1000,
reset: 0,
//奖池总数量
totalmoney: 100000,
groupConf: {
//档位
base: {
loglimit:2000,
arr:[
{
//权重
"weight": 50,
//获得范围
"numrange": [1000,1500]
},
{
//权重
"weight": 30,
//获得范围
"numrange": [1500,2000]
},
{
//权重
"weight": 15,
//获得范围
"numrange": [2000,3000]
},
{
//权重
"weight": 5,
//获得范围
"numrange": [3000,8000]
}
]
}
}
}
} }
] ]

View File

@ -1365,5 +1365,18 @@
"display": { "display": {
"lv": 15 "lv": 15
} }
},
"leigoulibao": {
"name": "leigoulibao",
"undefined": "累购礼包",
"and": {
"lv": 15
},
"or": {},
"time": 0,
"tips": "openCond_tips_96",
"display": {
"lv": 15
}
} }
} }

View File

@ -933,7 +933,7 @@
}, },
{ {
"a": "hero", "a": "hero",
"t": "4006", "t": "4013",
"n": 1 "n": 1
}, },
{ {
@ -975,7 +975,7 @@
{ {
"a": "item", "a": "item",
"t": "4", "t": "4",
"n": 100 "n": 10
} }
], ],
"firstPayPrize": [], "firstPayPrize": [],
@ -2522,32 +2522,6 @@
"fanLiBi": 200, "fanLiBi": 200,
"currency": "CNY" "currency": "CNY"
}, },
"136Gift1": {
"id": "136Gift1",
"money": 60,
"payExp": [
{
"a": "attr",
"t": "payExp",
"n": 600
}
],
"prize": [
{
"a": "item",
"t": "14",
"n": 50
}
],
"firstPayPrize": [],
"name": "pay_name_136Gift2",
"undefined": "136礼包打包购买",
"time": 604800,
"buys": 0,
"needVip": 0,
"front": {},
"currency": "CNY"
},
"136Gift2": { "136Gift2": {
"id": "136Gift2", "id": "136Gift2",
"money": 1, "money": 1,
@ -2568,6 +2542,11 @@
"a": "item", "a": "item",
"t": "12", "t": "12",
"n": 100 "n": 100
},
{
"a": "attr",
"t": "jingxuanbi",
"n": 1
} }
], ],
"firstPayPrize": [], "firstPayPrize": [],
@ -2581,42 +2560,6 @@
}, },
"136Gift3": { "136Gift3": {
"id": "136Gift3", "id": "136Gift3",
"money": 3,
"payExp": [
{
"a": "attr",
"t": "payExp",
"n": 30
}
],
"prize": [
{
"a": "attr",
"t": "rmbmoney",
"n": 60
},
{
"a": "item",
"t": "12",
"n": 100
},
{
"a": "item",
"t": "600",
"n": 1
}
],
"firstPayPrize": [],
"name": "pay_name_136Gift4",
"undefined": "3元礼包",
"time": 86400,
"buys": 0,
"needVip": 0,
"front": {},
"currency": "CNY"
},
"136Gift4": {
"id": "136Gift4",
"money": 6, "money": 6,
"payExp": [ "payExp": [
{ {
@ -2640,6 +2583,52 @@
"a": "item", "a": "item",
"t": "600", "t": "600",
"n": 2 "n": 2
},
{
"a": "attr",
"t": "jingxuanbi",
"n": 3
}
],
"firstPayPrize": [],
"name": "pay_name_136Gift4",
"undefined": "3元礼包",
"time": 86400,
"buys": 0,
"needVip": 0,
"front": {},
"currency": "CNY"
},
"136Gift4": {
"id": "136Gift4",
"money": 12,
"payExp": [
{
"a": "attr",
"t": "payExp",
"n": 120
}
],
"prize": [
{
"a": "attr",
"t": "rmbmoney",
"n": 240
},
{
"a": "item",
"t": "12",
"n": 500
},
{
"a": "item",
"t": "600",
"n": 3
},
{
"a": "attr",
"t": "jingxuanbi",
"n": 8
} }
], ],
"firstPayPrize": [], "firstPayPrize": [],
@ -2653,12 +2642,12 @@
}, },
"136GiftAll": { "136GiftAll": {
"id": "136GiftAll", "id": "136GiftAll",
"money": 60, "money": 18,
"payExp": [ "payExp": [
{ {
"a": "attr", "a": "attr",
"t": "payExp", "t": "payExp",
"n": 600 "n": 180
} }
], ],
"prize": [], "prize": [],
@ -2669,6 +2658,7 @@
"buys": 0, "buys": 0,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"fanLiBi": 950,
"currency": "CNY" "currency": "CNY"
}, },
"xianshizhaomu_gift_1": { "xianshizhaomu_gift_1": {
@ -4119,7 +4109,7 @@
"name": "pay_name_djlb_2", "name": "pay_name_djlb_2",
"undefined": "枪油补充包", "undefined": "枪油补充包",
"time": 86400, "time": 86400,
"buys": 0, "buys": 3,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4145,7 +4135,7 @@
"name": "pay_name_djlb_1", "name": "pay_name_djlb_1",
"undefined": "能量饮料补充包", "undefined": "能量饮料补充包",
"time": 86400, "time": 86400,
"buys": 0, "buys": 2,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4171,7 +4161,7 @@
"name": "pay_name_djlb_12", "name": "pay_name_djlb_12",
"undefined": "弹壳补充包", "undefined": "弹壳补充包",
"time": 86400, "time": 86400,
"buys": 0, "buys": 3,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4197,7 +4187,7 @@
"name": "pay_name_djlb_18", "name": "pay_name_djlb_18",
"undefined": "装备蓝图补充包", "undefined": "装备蓝图补充包",
"time": 86400, "time": 86400,
"buys": 0, "buys": 3,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4217,7 +4207,7 @@
"name": "pay_name_mingwang_2", "name": "pay_name_mingwang_2",
"undefined": "名望礼包_68元", "undefined": "名望礼包_68元",
"time": 86400, "time": 86400,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4237,7 +4227,7 @@
"name": "pay_name_mingwang_3", "name": "pay_name_mingwang_3",
"undefined": "名望礼包_648元", "undefined": "名望礼包_648元",
"time": 86400, "time": 86400,
"buys": 0, "buys": 2,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4257,7 +4247,7 @@
"name": "pay_name_mingwang_4", "name": "pay_name_mingwang_4",
"undefined": "名望礼包_128元", "undefined": "名望礼包_128元",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4433,7 +4423,7 @@
"name": "pay_name_guanqialibao_1", "name": "pay_name_guanqialibao_1",
"undefined": "关卡礼包_6", "undefined": "关卡礼包_6",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4469,7 +4459,7 @@
"name": "pay_name_guanqialibao_2", "name": "pay_name_guanqialibao_2",
"undefined": "关卡礼包_30", "undefined": "关卡礼包_30",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4505,7 +4495,7 @@
"name": "pay_name_guanqialibao_3", "name": "pay_name_guanqialibao_3",
"undefined": "关卡礼包_68", "undefined": "关卡礼包_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4541,7 +4531,7 @@
"name": "pay_name_guanqialibao_4", "name": "pay_name_guanqialibao_4",
"undefined": "关卡礼包_68", "undefined": "关卡礼包_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4582,7 +4572,7 @@
"name": "pay_name_daojulibao_1", "name": "pay_name_daojulibao_1",
"undefined": "专属润滑剂不足_30", "undefined": "专属润滑剂不足_30",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4623,7 +4613,7 @@
"name": "pay_name_daojulibao_2", "name": "pay_name_daojulibao_2",
"undefined": "专属润滑剂不足_68", "undefined": "专属润滑剂不足_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4664,7 +4654,7 @@
"name": "pay_name_daojulibao_3", "name": "pay_name_daojulibao_3",
"undefined": "专属润滑剂不足_128", "undefined": "专属润滑剂不足_128",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4705,7 +4695,7 @@
"name": "pay_name_daojulibao_4", "name": "pay_name_daojulibao_4",
"undefined": "配件零件不足_30", "undefined": "配件零件不足_30",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4746,7 +4736,7 @@
"name": "pay_name_daojulibao_5", "name": "pay_name_daojulibao_5",
"undefined": "配件零件不足_68", "undefined": "配件零件不足_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4787,7 +4777,7 @@
"name": "pay_name_daojulibao_6", "name": "pay_name_daojulibao_6",
"undefined": "配件零件不足_128", "undefined": "配件零件不足_128",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4828,7 +4818,7 @@
"name": "pay_name_daojulibao_7", "name": "pay_name_daojulibao_7",
"undefined": "装备蓝图不足_30", "undefined": "装备蓝图不足_30",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4869,7 +4859,7 @@
"name": "pay_name_daojulibao_8", "name": "pay_name_daojulibao_8",
"undefined": "装备蓝图不足_68", "undefined": "装备蓝图不足_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4910,7 +4900,7 @@
"name": "pay_name_daojulibao_9", "name": "pay_name_daojulibao_9",
"undefined": "装备蓝图不足_128", "undefined": "装备蓝图不足_128",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4951,7 +4941,7 @@
"name": "pay_name_daojulibao_10", "name": "pay_name_daojulibao_10",
"undefined": "调校合金不足_30", "undefined": "调校合金不足_30",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -4992,7 +4982,7 @@
"name": "pay_name_daojulibao_11", "name": "pay_name_daojulibao_11",
"undefined": "调校合金不足_68", "undefined": "调校合金不足_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5033,7 +5023,7 @@
"name": "pay_name_daojulibao_12", "name": "pay_name_daojulibao_12",
"undefined": "调校合金不足_128", "undefined": "调校合金不足_128",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5064,7 +5054,7 @@
"name": "pay_name_zhanbailibao_1", "name": "pay_name_zhanbailibao_1",
"undefined": "战败礼包_68", "undefined": "战败礼包_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5095,7 +5085,7 @@
"name": "pay_name_zhanbailibao_2", "name": "pay_name_zhanbailibao_2",
"undefined": "战败礼包_68", "undefined": "战败礼包_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5126,7 +5116,7 @@
"name": "pay_name_zhanbailibao_3", "name": "pay_name_zhanbailibao_3",
"undefined": "战败礼包_68", "undefined": "战败礼包_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5157,7 +5147,7 @@
"name": "pay_name_choukalibao_1", "name": "pay_name_choukalibao_1",
"undefined": "抽卡礼包_68", "undefined": "抽卡礼包_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5188,7 +5178,7 @@
"name": "pay_name_choukalibao_2", "name": "pay_name_choukalibao_2",
"undefined": "抽卡礼包_68", "undefined": "抽卡礼包_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5219,7 +5209,7 @@
"name": "pay_name_choukalibao_3", "name": "pay_name_choukalibao_3",
"undefined": "抽卡礼包_68", "undefined": "抽卡礼包_68",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5239,7 +5229,7 @@
"name": "pay_name_shouchong_1", "name": "pay_name_shouchong_1",
"undefined": "首充礼包_6", "undefined": "首充礼包_6",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5259,7 +5249,7 @@
"name": "pay_name_shouchong_2", "name": "pay_name_shouchong_2",
"undefined": "首充礼包_30", "undefined": "首充礼包_30",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"
@ -5279,7 +5269,7 @@
"name": "pay_name_shouchong_3", "name": "pay_name_shouchong_3",
"undefined": "首充礼包_98", "undefined": "首充礼包_98",
"time": -1, "time": -1,
"buys": 0, "buys": 1,
"needVip": 0, "needVip": 0,
"front": {}, "front": {},
"currency": "CNY" "currency": "CNY"

View File

@ -511,7 +511,13 @@
"freeRefreshInterval": 0, "freeRefreshInterval": 0,
"freeRefreshNum": 0, "freeRefreshNum": 0,
"shopItems": [ "shopItems": [
10001 10001,
10002,
10003,
10004,
10005,
10006,
10007
], ],
"showItem": [ "showItem": [
{ {

View File

@ -6273,17 +6273,179 @@
{ {
"id": 10001, "id": 10001,
"a": "item", "a": "item",
"t": 4, "t": 617,
"n": 10, "n": 1,
"p": 1,
"colour": 6,
"buyNum": -1,
"openDay": 1,
"buyNeed": [
{
"a": "attr",
"t": "jingxuanbi",
"n": 150
}
],
"sale": 10,
"needVip": 0,
"needZCCG": 0,
"lv": [
1,
9999
],
"vipAddbuyNum": []
}
],
"10002": [
{
"id": 10002,
"a": "item",
"t": 627,
"n": 1,
"p": 1,
"colour": 5,
"buyNum": -1,
"openDay": 1,
"buyNeed": [
{
"a": "attr",
"t": "jingxuanbi",
"n": 60
}
],
"sale": 10,
"needVip": 0,
"needZCCG": 0,
"lv": [
1,
9999
],
"vipAddbuyNum": []
}
],
"10003": [
{
"id": 10003,
"a": "item",
"t": 605,
"n": 1,
"p": 1,
"colour": 5,
"buyNum": -1,
"openDay": 1,
"buyNeed": [
{
"a": "attr",
"t": "jingxuanbi",
"n": 18
}
],
"sale": 10,
"needVip": 0,
"needZCCG": 0,
"lv": [
1,
9999
],
"vipAddbuyNum": []
}
],
"10004": [
{
"id": 10004,
"a": "item",
"t": 24,
"n": 2,
"p": 1,
"colour": 5,
"buyNum": -1,
"openDay": 1,
"buyNeed": [
{
"a": "attr",
"t": "jingxuanbi",
"n": 6
}
],
"sale": 10,
"needVip": 0,
"needZCCG": 0,
"lv": [
1,
9999
],
"vipAddbuyNum": []
}
],
"10005": [
{
"id": 10005,
"a": "item",
"t": 12,
"n": 200,
"p": 1, "p": 1,
"colour": 4, "colour": 4,
"buyNum": -1, "buyNum": -1,
"openDay": 1, "openDay": 1,
"buyNeed": [ "buyNeed": [
{ {
"a": "item", "a": "attr",
"t": "15", "t": "jingxuanbi",
"n": 2800 "n": 6
}
],
"sale": 10,
"needVip": 0,
"needZCCG": 0,
"lv": [
1,
9999
],
"vipAddbuyNum": []
}
],
"10006": [
{
"id": 10006,
"a": "attr",
"t": "jinbi",
"n": 1000000,
"p": 1,
"colour": 3,
"buyNum": -1,
"openDay": 1,
"buyNeed": [
{
"a": "attr",
"t": "jingxuanbi",
"n": 3
}
],
"sale": 10,
"needVip": 0,
"needZCCG": 0,
"lv": [
1,
9999
],
"vipAddbuyNum": []
}
],
"10007": [
{
"id": 10007,
"a": "item",
"t": 1,
"n": 500000,
"p": 1,
"colour": 3,
"buyNum": -1,
"openDay": 1,
"buyNeed": [
{
"a": "attr",
"t": "jingxuanbi",
"n": 5
} }
], ],
"sale": 10, "sale": 10,

View File

@ -203,7 +203,7 @@
"id": 11, "id": 11,
"shopId": 13, "shopId": 13,
"shopType": 12, "shopType": 12,
"title": "wsw_wz_dhsd", "title": "wsw_wz_mrjxdh",
"undefined": "兑换商店", "undefined": "兑换商店",
"openCond": "shop_13", "openCond": "shop_13",
"des": "intr_shop_des_13", "des": "intr_shop_des_13",
@ -211,7 +211,7 @@
"cost": [ "cost": [
{ {
"a": "attr", "a": "attr",
"t": "rmbmoney", "t": "jingxuanbi",
"n": 1 "n": 1
} }
] ]

View File

@ -8,11 +8,12 @@
], ],
"payId": [ "payId": [
"guanqialibao_1", "guanqialibao_1",
"guanqialibao_3" "guanqialibao_2"
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"2": { "2": {
"id": 2, "id": 2,
@ -23,11 +24,12 @@
], ],
"payId": [ "payId": [
"guanqialibao_1", "guanqialibao_1",
"guanqialibao_3" "guanqialibao_2"
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"3": { "3": {
"id": 3, "id": 3,
@ -43,7 +45,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"4": { "4": {
"id": 4, "id": 4,
@ -59,7 +62,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"5": { "5": {
"id": 5, "id": 5,
@ -75,7 +79,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"6": { "6": {
"id": 6, "id": 6,
@ -91,7 +96,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"7": { "7": {
"id": 7, "id": 7,
@ -107,7 +113,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"8": { "8": {
"id": 8, "id": 8,
@ -123,7 +130,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"9": { "9": {
"id": 9, "id": 9,
@ -139,7 +147,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"10": { "10": {
"id": 10, "id": 10,
@ -155,7 +164,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"11": { "11": {
"id": 11, "id": 11,
@ -171,7 +181,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"12": { "12": {
"id": 12, "id": 12,
@ -187,7 +198,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"13": { "13": {
"id": 13, "id": 13,
@ -203,7 +215,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"14": { "14": {
"id": 14, "id": 14,
@ -219,7 +232,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"15": { "15": {
"id": 15, "id": 15,
@ -235,7 +249,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"16": { "16": {
"id": 16, "id": 16,
@ -251,7 +266,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"17": { "17": {
"id": 17, "id": 17,
@ -267,7 +283,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"18": { "18": {
"id": 18, "id": 18,
@ -283,7 +300,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "gkts"
}, },
"101": { "101": {
"id": 101, "id": 101,
@ -302,7 +320,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 86400, "displayCD": 86400,
"scale": 3000 "scale": 3000,
"icon": "sclb"
}, },
"102": { "102": {
"id": 102, "id": 102,
@ -321,7 +340,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 86400, "displayCD": 86400,
"scale": 3000 "scale": 3000,
"icon": "sclb"
}, },
"103": { "103": {
"id": 103, "id": 103,
@ -340,7 +360,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 86400, "displayCD": 86400,
"scale": 3000 "scale": 3000,
"icon": "sclb"
}, },
"104": { "104": {
"id": 104, "id": 104,
@ -359,7 +380,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 86400, "displayCD": 86400,
"scale": 3000 "scale": 3000,
"icon": "sclb"
}, },
"401": { "401": {
"id": 401, "id": 401,
@ -373,7 +395,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"402": { "402": {
"id": 402, "id": 402,
@ -387,7 +410,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"403": { "403": {
"id": 403, "id": 403,
@ -402,7 +426,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"404": { "404": {
"id": 404, "id": 404,
@ -417,7 +442,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"405": { "405": {
"id": 405, "id": 405,
@ -432,7 +458,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"406": { "406": {
"id": 406, "id": 406,
@ -447,7 +474,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"407": { "407": {
"id": 407, "id": 407,
@ -462,7 +490,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"408": { "408": {
"id": 408, "id": 408,
@ -477,7 +506,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"409": { "409": {
"id": 409, "id": 409,
@ -492,7 +522,8 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"410": { "410": {
"id": 410, "id": 410,
@ -507,12 +538,45 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
}, },
"411": { "411": {
"id": 411, "id": 411,
"type": 5, "type": 5,
"typeName": "tuisonglibao_name_1", "typeName": "tuisonglibao_name_1",
"num": [
76
],
"payId": [
"lv76_1",
"lv76_2"
],
"time": 3600,
"displayCD": 3600,
"scale": 3000,
"icon": "djlb"
},
"412": {
"id": 412,
"type": 5,
"typeName": "tuisonglibao_name_1",
"num": [
79
],
"payId": [
"lv79_1",
"lv79_2"
],
"time": 3600,
"displayCD": 3600,
"scale": 3000,
"icon": "djlb"
},
"413": {
"id": 413,
"type": 5,
"typeName": "tuisonglibao_name_1",
"num": [ "num": [
82 82
], ],
@ -522,6 +586,7 @@
], ],
"time": 3600, "time": 3600,
"displayCD": 3600, "displayCD": 3600,
"scale": 3000 "scale": 3000,
"icon": "djlb"
} }
} }

View File

@ -1773,6 +1773,24 @@ type gc_yuyuemail = {
'prize': { "a": string, "t": string, "n": number, [x: string]: any }[] 'prize': { "a": string, "t": string, "n": number, [x: string]: any }[]
}; };
type gc_push_gift = {
[k: string]: {
/**礼包id*/
id: number
/**礼包类型*/
type: number
/**礼包参数*/
num: any[]
/**购买id*/
payId: string[]
/**持续时间*/
time: number
/**冷却时间*/
displayCD: number
/**显示返利比*/
scale: number
}
}
type gcType = { type gcType = {
[key: string]: any [key: string]: any
@ -1922,6 +1940,7 @@ type gcType = {
kfcb_content: gc_kfcb_content kfcb_content: gc_kfcb_content
kfcb_prize: gc_kfcb_prize kfcb_prize: gc_kfcb_prize
yuyuemail: gc_yuyuemail yuyuemail: gc_yuyuemail
tuisonglibao: gc_push_gift
} }

View File

@ -351,7 +351,7 @@ class Lng {
huoqupaihang: "huoqupaihang"; huoqupaihang: "huoqupaihang";
wucigonghui: "wucigonghui"; wucigonghui: "wucigonghui";
nameyicunzai: "nameyicunzai"; nameyicunzai: "nameyicunzai";
ljlibaotips_8:"ljlibaotips_8";
"11111" = "globalThis.lng.chat_1" "11111" = "globalThis.lng.chat_1"
// return call.error('', { code: -3, message: globalThis.lng.chat_2 }); // return call.error('', { code: -3, message: globalThis.lng.chat_2 });

View File

@ -21,6 +21,8 @@ import {ResOpen as ResOpenZhoulibao} from '../shared/protocols/event/zhoulibao/P
import {ResOpen as ResOpenZixuanlibao} from '../shared/protocols/event/zixuanlibao/PtlOpen'; import {ResOpen as ResOpenZixuanlibao} from '../shared/protocols/event/zixuanlibao/PtlOpen';
import {ResOpen as ResOpenKaifujingsai} from '../shared/protocols/kaifujingsai/PtlOpen'; import {ResOpen as ResOpenKaifujingsai} from '../shared/protocols/kaifujingsai/PtlOpen';
import {ResOpen as ResOpenZhoumolibao} from '../shared/protocols/event/zhoumolibao/PtlOpen'; import {ResOpen as ResOpenZhoumolibao} from '../shared/protocols/event/zhoumolibao/PtlOpen';
import {ResOpen as ResOpenPobinglibao} from '../shared/protocols/event/pobinglibao/PtlOpen';
import {ResOpen as ResOpenLeiChongLiBao} from '../shared/protocols/event/leichonglibao/PtlOpen';
export type eventType = { export type eventType = {
shouchong: { shouchong: {
@ -50,7 +52,11 @@ export type eventType = {
qirichongzhi: Omit<ResOpenQirichongzhi, 'finished'>; qirichongzhi: Omit<ResOpenQirichongzhi, 'finished'>;
jierihuodong: Omit<ResOpenJierihuodong, 'taskFinish'> & { refreshTime: number; }; jierihuodong: Omit<ResOpenJierihuodong, 'taskFinish'> & { refreshTime: number; };
kaifujingsai: ResOpenKaifujingsai; kaifujingsai: ResOpenKaifujingsai;
zhoumolibao: ResOpenZhoumolibao & { refreshTime: number; } zhoumolibao: ResOpenZhoumolibao & { refreshTime: number; };
pobinglibao: ResOpenPobinglibao
payForDiamond: {
[time: number]: number
}
} & { } & {
[k: `${number}jijin`]: ResOpenYuedujijin; [k: `${number}jijin`]: ResOpenYuedujijin;
[k: `yangchengmubiao${number}`]: yangchengmubiao; [k: `yangchengmubiao${number}`]: yangchengmubiao;
@ -60,6 +66,7 @@ export type eventType = {
[k: `zixuanlibao${number}`]: ResOpenZixuanlibao; [k: `zixuanlibao${number}`]: ResOpenZixuanlibao;
[k: `leijichongzhi${number}`]: Omit<ResOpenLeijichongzhi, 'payNum'>; [k: `leijichongzhi${number}`]: Omit<ResOpenLeijichongzhi, 'payNum'>;
[k: `qiridenglu${number}`]: Pick<ResOpenQiridenglu, 'recPrize'>; [k: `qiridenglu${number}`]: Pick<ResOpenQiridenglu, 'recPrize'>;
[k: `leichonglibao${number}`]: ResOpenLeiChongLiBao & { opentime: number };
}; };
export type CollectionEvent<T extends keyof eventType> = { export type CollectionEvent<T extends keyof eventType> = {

View File

@ -0,0 +1,13 @@
import {ObjectId} from "mongodb";
import {ResOpen} from "../shared/protocols/pushgift/PtlOpen";
export type Gift = {
id: string
uid: string
buy: number[]
ctime: number
passTime: number
ext_data: { [key: string]: any }
}
export type CollectionPushGift = Gift & { _id: ObjectId };

View File

@ -59,6 +59,7 @@ import {CollectionPlayerBehavior} from "./collection_player_behavior";
import {CollectionRmbuse} from "./collection_rmbuse"; import {CollectionRmbuse} from "./collection_rmbuse";
import {CollectionFightLog} from "./collection_fightLog"; import {CollectionFightLog} from "./collection_fightLog";
import {CollectionShop} from "./collection_shop"; import {CollectionShop} from "./collection_shop";
import {CollectionPushGift} from "./collection_pushgift";
export type MongodbCollections = { export type MongodbCollections = {
user: CollectionUser; user: CollectionUser;
@ -131,4 +132,5 @@ export type MongodbCollections = {
rmbuse: CollectionRmbuse rmbuse: CollectionRmbuse
fightLog: CollectionFightLog fightLog: CollectionFightLog
shop: CollectionShop shop: CollectionShop
pushgift:CollectionPushGift
}; };

View File

@ -9,6 +9,7 @@ import {HeroFun} from './hero';
import {UserFun} from './user'; import {UserFun} from './user';
import {re, string} from "mathjs"; import {re, string} from "mathjs";
import {getGud} from './gud'; import {getGud} from './gud';
import {PushGiftFun} from "./pushgift";
type fightType = 'tanxian' | 'pata' | 'jjc' | 'gbtx' | 'qjzzd' | 'meirishilian' | 'wzrycross'; type fightType = 'tanxian' | 'pata' | 'jjc' | 'gbtx' | 'qjzzd' | 'meirishilian' | 'wzrycross';
@ -86,9 +87,16 @@ export class FightFun {
/**挑战竞技场 */ /**挑战竞技场 */
static async fightJJc(call: ApiCall, rankInfo: rankInfo) { static async fightJJc(call: ApiCall, rankInfo: rankInfo) {
if (rankInfo.player.uid.indexOf('npc_') != -1) return await this.fightNpc(call, G.gc.jjc_npc[rankInfo.player.uid].npcId, 'jjc', await this.getPlayerFightData(call.conn.uid)); if (rankInfo.player.uid.indexOf('npc_') != -1) return await this.fightNpc(call, G.gc.jjc_npc[rankInfo.player.uid].npcId, 'jjc', await this.getPlayerFightData(call.conn.uid));
return this.fight([await this.getPlayerFightData(call.conn.uid), await this.getPlayerFightData(rankInfo.player.uid)]);
let result = this.fight([await this.getPlayerFightData(call.conn.uid), await this.getPlayerFightData(rankInfo.player.uid)]);
// 竞技场 战败触发推送礼包
if (result.winSide != 0) {
PushGiftFun.chkLoseGift(call.uid)
}
return result
} }
/**挑战npc */ /**挑战npc */
@ -106,7 +114,13 @@ export class FightFun {
let npc = formatNpcData(npcId); let npc = formatNpcData(npcId);
return this.fight([my, npc], 30, 'pve'); let result = this.fight([my, npc], 30, 'pve');
// 主线 爬塔 战败触发推送礼包
if (result.winSide != 0 && ["tanxian", "pata"].includes(type)) {
PushGiftFun.chkLoseGift(call.uid)
}
return result
} }
/** /**

View File

@ -14,9 +14,10 @@ import {PublicShared} from '../shared/public/public';
import {HeroFun} from './hero'; import {HeroFun} from './hero';
import {ShiwuFun} from './shiwu'; import {ShiwuFun} from './shiwu';
import {UserFun} from './user'; import {UserFun} from './user';
import { getItemByItemId, getItemNum } from './item'; import {getItemByItemId, getItemNum} from './item';
import { getGud, setGud } from './gud'; import {getGud, setGud} from './gud';
import {addGameLog} from "../gameLog"; import {addGameLog} from "../gameLog";
import {PushGiftFun} from "./pushgift";
export type call = { export type call = {
@ -35,7 +36,7 @@ export type call = {
}; };
service: { name: string }; service: { name: string };
addEventMsg: ApiCall['addEventMsg']; addEventMsg: ApiCall['addEventMsg'];
req: { } req: {}
}; };
export class PlayerFun { export class PlayerFun {
@ -66,6 +67,8 @@ export class PlayerFun {
if (has < atn.n) { if (has < atn.n) {
if (err) { if (err) {
// 消耗不足 触发推送礼包
PushGiftFun.chkItemGift(call.uid, atn)
throw new TsrpcError('', {code: -104, atn: atn}); throw new TsrpcError('', {code: -104, atn: atn});
} else { } else {
return {isOk: false, atn: atn}; return {isOk: false, atn: atn};
@ -143,15 +146,15 @@ export class PlayerFun {
shiwu.length > 0 && this.addShiwu(call, shiwu), shiwu.length > 0 && this.addShiwu(call, shiwu),
peijian.length > 0 && this.addPeijian(call, peijian) peijian.length > 0 && this.addPeijian(call, peijian)
]); ]);
return prizeList; return prizeList;
}; };
//attr里的指定字段的值不能小于0 //attr里的指定字段的值不能小于0
static fixAttrLteZero(t:string, val:number){ static fixAttrLteZero(t: string, val: number) {
if(['jinbi','rmbmoney','payExp','nexp'].includes(t) && val < 0){ if (['jinbi', 'rmbmoney', 'payExp', 'nexp'].includes(t) && val < 0) {
return 0 return 0
}else{ } else {
return val; return val;
} }
} }
@ -198,6 +201,16 @@ export class PlayerFun {
// 修改属性应在相关奖励领取之前,否则奖励内获取的用户数据是旧数据 // 修改属性应在相关奖励领取之前,否则奖励内获取的用户数据是旧数据
// await this.changeAttr(call.conn.uid, change); // await this.changeAttr(call.conn.uid, change);
call.addEventMsg('msg_s2c/PlayerChange', change); call.addEventMsg('msg_s2c/PlayerChange', change);
// 等级改变 触发推送礼包
if (change["lv"]) {
PushGiftFun.chkLvGift(call.uid, change["lv"])
}
// 关卡改变 触发推送礼包
if (change["mapId"]) {
PushGiftFun.chkLevelGift(call.uid, change["mapId"])
}
} }
static async changeAttrLog(uid: string, change, atn, before) { static async changeAttrLog(uid: string, change, atn, before) {
@ -216,9 +229,9 @@ export class PlayerFun {
static async changeAttr(uid: string, change: Partial<player>) { static async changeAttr(uid: string, change: Partial<player>) {
//for (let k in change) { //for (let k in change) {
//G.redis.set('user', uid, k as any, change[k]); //G.redis.set('user', uid, k as any, change[k]);
//} //}
setGud(uid,change); setGud(uid, change);
G.mongodb.collection('user').updateOne({uid: uid}, {$set: change}); G.mongodb.collection('user').updateOne({uid: uid}, {$set: change});
@ -299,7 +312,11 @@ export class PlayerFun {
G.mongodb.collection('item').updateOne(upObj.filter, upObj.update, upObj.options); G.mongodb.collection('item').updateOne(upObj.filter, upObj.update, upObj.options);
call.addEventMsg('msg_s2c/ItemChange', atn.t, data); call.addEventMsg('msg_s2c/ItemChange', atn.t, data);
addGameLog(call.uid, "_itemChange", {"additem":1}, {"filter": upObj.filter, "update": upObj.update, "options": upObj.options}) addGameLog(call.uid, "_itemChange", {"additem": 1}, {
"filter": upObj.filter,
"update": upObj.update,
"options": upObj.options
})
} else { } else {
if (item.num + atn.n <= 0) { if (item.num + atn.n <= 0) {
await Promise.all([ await Promise.all([
@ -311,13 +328,13 @@ export class PlayerFun {
//await G.redis.del('item', call.uid, atn.t); //await G.redis.del('item', call.uid, atn.t);
//await G.mongodb.collection('item').deleteOne({uid: call.uid, itemId: atn.t}); //await G.mongodb.collection('item').deleteOne({uid: call.uid, itemId: atn.t});
call.addEventMsg('msg_s2c/ItemChange', atn.t, {num: 0}); call.addEventMsg('msg_s2c/ItemChange', atn.t, {num: 0});
addGameLog(call.uid, "_itemChange",{"delitem":1}, {"itemId": atn.t}) addGameLog(call.uid, "_itemChange", {"delitem": 1}, {"itemId": atn.t})
} else { } else {
await Promise.all([ await Promise.all([
////去掉item Redis相关 ////去掉item Redis相关
//G.redis.set('item', call.uid, atn.t, 'lastTime', upObj.update.$set.lastTime), //G.redis.set('item', call.uid, atn.t, 'lastTime', upObj.update.$set.lastTime),
//G.redis.numIncrBy('item', call.uid, atn.t, 'num', atn.n), //G.redis.numIncrBy('item', call.uid, atn.t, 'num', atn.n),
G.mongodb.collection('item').updateOne(upObj.filter, upObj.update, upObj.options) G.mongodb.collection('item').updateOne(upObj.filter, upObj.update, upObj.options)
]); ]);
// await G.redis.set('item', call.uid, atn.t, 'lastTime', upObj.update.$set.lastTime); // await G.redis.set('item', call.uid, atn.t, 'lastTime', upObj.update.$set.lastTime);
@ -327,7 +344,12 @@ export class PlayerFun {
num: item.num + atn.n, num: item.num + atn.n,
lastTime: upObj.update.$set.lastTime lastTime: upObj.update.$set.lastTime
}); });
addGameLog(call.uid, "_itemChange",{"attritem":1}, {"filter": upObj.filter, "update": upObj.update, "options": upObj.options,newNum:item.num + atn.n}) addGameLog(call.uid, "_itemChange", {"attritem": 1}, {
"filter": upObj.filter,
"update": upObj.update,
"options": upObj.options,
newNum: item.num + atn.n
})
} }
} }
} }
@ -353,7 +375,7 @@ export class PlayerFun {
}).reduce((a, b) => a.concat(b)); }).reduce((a, b) => a.concat(b));
let result = await G.mongodb.collection('equip').insertMany(insertData); let result = await G.mongodb.collection('equip').insertMany(insertData);
addGameLog(call.uid, "_addEquip",{}, insertData) addGameLog(call.uid, "_addEquip", {}, insertData)
insertData.forEach((v, key) => { insertData.forEach((v, key) => {
let id = result.insertedIds[key].toHexString(); let id = result.insertedIds[key].toHexString();
@ -400,7 +422,7 @@ export class PlayerFun {
G.mongodb.collection('equip').deleteOne({uid: call.uid, _id: new ObjectId(_id)}); G.mongodb.collection('equip').deleteOne({uid: call.uid, _id: new ObjectId(_id)});
call.addEventMsg('msg_s2c/EquipChange', _id, {num: 0}); call.addEventMsg('msg_s2c/EquipChange', _id, {num: 0});
addGameLog(call.uid, "_cutEquip",{}, {_id:_id}) addGameLog(call.uid, "_cutEquip", {}, {_id: _id})
} }
} }
@ -428,7 +450,7 @@ export class PlayerFun {
}); });
let result = await G.mongodb.collection('hero').insertMany(insertData); let result = await G.mongodb.collection('hero').insertMany(insertData);
addGameLog(call.uid, "_addHero",{}, insertData) addGameLog(call.uid, "_addHero", {}, insertData)
for (let key = 0; key < insertData.length; key++) { for (let key = 0; key < insertData.length; key++) {
let v = insertData[key] let v = insertData[key]
@ -483,7 +505,7 @@ export class PlayerFun {
G.redis.del('hero', call.uid, _id); G.redis.del('hero', call.uid, _id);
G.mongodb.collection('hero').deleteOne({uid: call.uid, _id: new ObjectId(_id)}); G.mongodb.collection('hero').deleteOne({uid: call.uid, _id: new ObjectId(_id)});
call.addEventMsg('msg_s2c/HeroChange', _id, {num: 0}); call.addEventMsg('msg_s2c/HeroChange', _id, {num: 0});
addGameLog(call.uid, "_cutHero",{}, {_id:_id}) addGameLog(call.uid, "_cutHero", {}, {_id: _id})
} }
} }
@ -514,7 +536,7 @@ export class PlayerFun {
}).reduce((a, b) => a.concat(b)); }).reduce((a, b) => a.concat(b));
let result = await G.mongodb.collection('shiwu').insertMany(insertData); let result = await G.mongodb.collection('shiwu').insertMany(insertData);
addGameLog(call.uid, "_addShiWu",{}, insertData) addGameLog(call.uid, "_addShiWu", {}, insertData)
insertData.forEach((v, key) => { insertData.forEach((v, key) => {
let id = result.insertedIds[key].toHexString(); let id = result.insertedIds[key].toHexString();
@ -546,7 +568,7 @@ export class PlayerFun {
// G.redis.del('shiwu', call.uid, _id); // G.redis.del('shiwu', call.uid, _id);
G.mongodb.collection('shiwu').deleteOne({uid: call.uid, _id: new ObjectId(_id)}); G.mongodb.collection('shiwu').deleteOne({uid: call.uid, _id: new ObjectId(_id)});
call.addEventMsg('msg_s2c/ShiwuChange', _id, {num: 0}); call.addEventMsg('msg_s2c/ShiwuChange', _id, {num: 0});
addGameLog(call.uid, "_cutShiwu",{}, {_id:_id}) addGameLog(call.uid, "_cutShiwu", {}, {_id: _id})
} }
} }
@ -568,7 +590,7 @@ export class PlayerFun {
}).reduce((a, b) => a.concat(b)); }).reduce((a, b) => a.concat(b));
let result = await G.mongodb.collection('peijian').insertMany(insertData); let result = await G.mongodb.collection('peijian').insertMany(insertData);
addGameLog(call.uid, "_addPeiJian",{}, insertData) addGameLog(call.uid, "_addPeiJian", {}, insertData)
insertData.forEach((v, key) => { insertData.forEach((v, key) => {
let {_id, uid, ...ops} = v; let {_id, uid, ...ops} = v;
@ -609,7 +631,7 @@ export class PlayerFun {
G.redis.del('peijian', call.uid, _id); G.redis.del('peijian', call.uid, _id);
G.mongodb.collection('peijian').deleteOne({uid: call.uid, _id: new ObjectId(_id)}); G.mongodb.collection('peijian').deleteOne({uid: call.uid, _id: new ObjectId(_id)});
call.addEventMsg('msg_s2c/PeijianChange', _id, {num: 0}); call.addEventMsg('msg_s2c/PeijianChange', _id, {num: 0});
addGameLog(call.uid, "_cutPeijian",{}, {_id:_id}) addGameLog(call.uid, "_cutPeijian", {}, {_id: _id})
} }
} }

179
src/public/pushgift.ts Normal file
View File

@ -0,0 +1,179 @@
import {PayFun} from "./pay";
const PushGiftType = {
LevelGift: 1, // 关卡推送
ItemGift: 2, // 道具推送
LoseGift: 3, // 战败推送
RecruitGift: 4, // 十连推送
LvGift: 5, // 等级推送
}
export class PushGiftFun {
static async getGift(uid: string) {
// 查询所有礼包
return (await G.mongodb.collection("pushgift").find({
uid: uid
}).toArray()).map((i) => {
let {_id, ...gift} = i;
return gift
})
}
static async chkItemGift(uid: string, atn: atn) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.ItemGift && conf.num[0].a == atn.a && conf.num[0].t == atn.t) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async chkLevelGift(uid: string, level: number) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.LevelGift && conf.num[0] == level) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async chkLvGift(uid: string, lv: number) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.LvGift && conf.num[0] == lv) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async chkLoseGift(uid: string) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.LoseGift) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async chkRecruitGift(uid: string) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.RecruitGift) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async pushGift(uid: string, gift_ids: string[]) {
let gifts = {};
(await this.getGift(uid)).forEach(i => gifts[i.id] = i)
for (let gift_id of gift_ids) {
let conf = G.gc.tuisonglibao[gift_id];
if (gifts[gift_id] && conf.displayCD > 0 && gifts[gift_id].ctime + conf.displayCD > G.time) {
continue
}
if (conf.type == PushGiftType.RecruitGift) {
if (gifts[gift_id]) {
if (gift_ids[gift_id].ext_data.num + 1 >= conf.num[0]) {
this.addGift(uid, gift_id, {num: 0})
} else {
G.mongodb.collection("pushgift").updateOne({
uid: uid, id: gift_id
}, {"$inc": {"ext_data.num": 1}})
}
} else {
// 招募礼包不存在 初始化数据 记录招募次数
G.mongodb.collection("pushgift").updateOne({
uid: uid, id: gift_id
}, {
$set: {
ctime: 0,
passTime: 0,
ext_data: {num: 1},
buy: conf.payId.map(() => 0),
}
}, {upsert: true})
}
} else {
this.addGift(uid, gift_id, {})
}
}
}
static async addGift(uid: string, giftid: string, ext_data: { [key: string]: any }) {
let conf = G.gc.tuisonglibao[giftid];
// 更新礼包
await G.mongodb.collection("pushgift").updateOne({
uid: uid, id: giftid
}, {
$set: {
ctime: G.time,
ext_data: ext_data,
passTime: G.time + conf.time,
buy: conf.payId.map(() => 0),
}
}, {upsert: true})
// 删除购买记录
PayFun.delPayLog(uid, ...conf.payId.map(i => {
return {payId: i, val: []}
}))
// 推送客户端消息
G.server.sendMsgByUid(uid, "msg_s2c/PushGiftChange", conf.id);
}
static async buy(uid: string, payId: string) {
// 购买礼包
let gift;
for (let gift_id in G.gc.tuisonglibao) {
let temp = G.gc.tuisonglibao[gift_id];
if (temp.payId.includes(payId)) {
gift = temp;
break
}
}
if (!gift) return;
let index = gift.payId.indexOf(payId);
let info = await G.mongodb.collection("pushgift").findOne({
uid: uid, id: gift.id.toString()
})
if (info.passTime >= G.time) {
await G.mongodb.collection("pushgift").updateOne({
uid: uid, id: gift.id.toString()
}, {$inc: {[`buy.${index}`]: 1}})
// 推送客户端消息
G.server.sendMsgByUid(uid, "msg_s2c/PushGiftChange", gift.id);
}
}
}

View File

@ -37,7 +37,8 @@ export type schedulerType =
| 'hbzb_zbs_clear' | 'hbzb_zbs_clear'
| 'hbzb_zbs_group' | 'hbzb_zbs_group'
| 'wzry_zuanshi16to8' | 'wzry_zuanshi16to8'
| "cross_email_pull"; | "cross_email_pull"
| "xiaofeijingsai_local_ctor";
export class SchedulerManage { export class SchedulerManage {
static logTime = false; static logTime = false;
@ -102,7 +103,7 @@ export abstract class Scheduler {
} }
init(){ init() {
Scheduler.schedulers.push(this); Scheduler.schedulers.push(this);
this.read().then(_ => { this.read().then(_ => {
this.log(`state: 准备完毕 预计下次执行时间:${new Date(this.startTime * 1000).format("YYYY-MM-DD hh:mm:ss")}`); this.log(`state: 准备完毕 预计下次执行时间:${new Date(this.startTime * 1000).format("YYYY-MM-DD hh:mm:ss")}`);

View File

@ -0,0 +1,69 @@
import {Scheduler, schedulerType} from './scheduler';
import {PublicShared} from "../../shared/public/public";
import {Wjjl} from "../../module/collection_wjjl";
import {ZhanLingTasks} from "../zhanling";
import {setGud} from '../gud';
import {HuoDongFun} from "../huodongfun";
import {EmailFun} from "../email";
import {sortRankList} from "../../api_s2c/event/xiaofeijingsai/ApiOpen";
/**
*
* 05
*/
export class Scheduler_xfjs_Local_Ctor extends Scheduler {
id: schedulerType = 'xiaofeijingsai_local_ctor';
time = 300;
name = '消费竞赛发奖定时器';
type: 'day' | 'week' = 'day';
// todo 测试
// get nextTime() {
// return G.time + 30;
// }
async read() {
await this.ctorStartTime();
this.isReady = false;
}
async start() {
let _hd = (await G.mongodb.collection('hdinfo').find({
htype: 11,
ttype: 0,
etime: {$lt: G.time, $gt: 99999999},
$or: [{isSendPrize: {$exists: false}}, {isSendPrize: false}],
}).sort({etime: -1}).limit(1).toArray())[0]
if (!_hd) return
let limit = _hd.data?.rank?.slice(-1)?.[0]?.rank?.slice(-1)?.[0] || 100
let rmbuse = await G.mongodb.collection('rmbuse').aggregate([
{$match: {isAdd: false, cTime: {$gte: _hd.stime, $lte: _hd.etime}}},
{$group: {_id: "$uid", total: {$sum: "$change"}}},
{$sort: {total: 1}},
{$limit: limit}
]).toArray()
let list: any = rmbuse.map(i => ({...i, total: R.negate(i.total)}))
let ranklist = sortRankList(_hd.data.rank, list)
R.forEach(i => {
let users = R.slice(i.rank[0] - 1, i.rank[1])(ranklist)
users.map(v => {
if (v._id == 'system') return
EmailFun.addEmail({
uid: v._id,
type: 'system',
title: _hd.data.mailTitle,
content: _hd.data.mailDes,
prize: i.prize,
contentInsertArr: [v.rank + 1]
});
})
})(_hd.data.rank)
await G.mongodb.collection('hdinfo').findOneAndUpdate({hdid: _hd.hdid}, {$set: {isSendPrize: true}})
}
}

View File

@ -1,35 +0,0 @@
import {MongoClient} from "mongodb";
import * as ramda from 'ramda'
import fs from "fs";
let R = ramda
async function start() {
//连接mongodb
let client = await MongoClient.connect('mongodbUrl');
console.log('链接成功')
let a: any = {}
for (let i = 1; i < 20; i++) {
let dbName = `blacklagoon_s${i}`
console.log(dbName)
let mongodb = client.db(dbName);
a[dbName] = {};
(await mongodb.collection('email').find({type: 'gm', uid: 'system'}).toArray()).map(i => {
a[dbName][i.title] = R.compose(R.map(i => ({[i[0]]: i.length})), R.values, R.filter(i => i.length > 1), R.groupBy(i => i))(i.prizelist)
console.log(a[dbName][i.title])
})
console.log(dbName, '查询完成')
}
fs.writeFileSync('tab.json', JSON.stringify(a, null, 2))
}
//定义全局变量
// ctor();
//启动服务
start().then(() => {
process.exit()
});

View File

@ -505,7 +505,7 @@ export async function setDbIndexes() {
index.key, index.key,
option option
); );
console.log('创建索引成功', coll, index); // console.log('创建索引成功', coll, index);
} catch (error) { } catch (error) {
if (error.codeName == 'IndexKeySpecsConflict') { if (error.codeName == 'IndexKeySpecsConflict') {
//当相同索引存在,但是配置(如unique expireAfterSeconds)不同时,会收到这个报错 //当相同索引存在,但是配置(如unique expireAfterSeconds)不同时,会收到这个报错
@ -519,7 +519,7 @@ export async function setDbIndexes() {
index.key, index.key,
option option
); );
console.log('创建索引成功', coll, index); // console.log('创建索引成功', coll, index);
} catch (error) { } catch (error) {
console.log('创建索引失败==>', coll, index, error.message); console.log('创建索引失败==>', coll, index, error.message);
} }

View File

@ -27,6 +27,7 @@ import { clusterRunOnce } from './clusterUtils';
import { addListener } from './globalListener'; import { addListener } from './globalListener';
import { SchedulerManage } from './public/scheduler/scheduler'; import { SchedulerManage } from './public/scheduler/scheduler';
import {CrossEmailPull} from "./public/scheduler/scheduler_cross_email_pull"; import {CrossEmailPull} from "./public/scheduler/scheduler_cross_email_pull";
import {Scheduler_xfjs_Local_Ctor} from "./public/scheduler/scheduler_xiaofeijingsai";
export async function startAfter() { export async function startAfter() {
//事件监听和定时器初始化 //事件监听和定时器初始化
@ -70,6 +71,7 @@ export async function startAfter() {
new Scheduler_hbzb_zbs_local_prize().init(); new Scheduler_hbzb_zbs_local_prize().init();
new Scheduler_hbzb_zbs_local_ready().init(); new Scheduler_hbzb_zbs_local_ready().init();
new SchedulerKbzzAutoApply().init(); new SchedulerKbzzAutoApply().init();
new Scheduler_xfjs_Local_Ctor().init();
new SchedulerSlzdClean().init(); new SchedulerSlzdClean().init();
new SchedulerSlzdPrize().init(); new SchedulerSlzdPrize().init();

View File

@ -98,6 +98,15 @@ function setWs(server: WsServer<ServiceType>) {
//执行 API 接口实现之前 //执行 API 接口实现之前
server.flows.preApiCallFlow.push(async call => { server.flows.preApiCallFlow.push(async call => {
// 临时停服维护方案
// let lng = {
// "zh-TW": "停服維護中,請等待!",
// "ko": "서버 점검 중, 잠시만 기다려 주세요.",
// "ja": "サーバーメンテナンス中、しばらくお待ちください。",
// "en": "Server under maintenance. Please wait.",
// }
// call.error("", {code: -1, message: lng[call.req.lng] || lng["ja"]})
// return null;
//是否短时间内重复请求某个api //是否短时间内重复请求某个api
// let timeIntervalLimit = call.service.conf?.timeIntervalLimit == undefined ? 500 : call.service.conf?.timeIntervalLimit; // let timeIntervalLimit = call.service.conf?.timeIntervalLimit == undefined ? 500 : call.service.conf?.timeIntervalLimit;

View File

@ -1,151 +0,0 @@
{
"hdid" : 91029302193,
"htype" : 8,
"stype" : 800,
"ttype" : 0,
"stime" : 1702396800,
"rtime" : 1703088000,
"etime" : 1703088000,
"name" : "christmas",
"icon" : "icon_xfdj",
"showtime" : "根据玩家注册时间,游戏返回时复写",
"data" : {
"task" : {
"1": {
"pval" : 1,
"stype" : "",
"cond": [],
"prize" : [
{
"a" : "item",
"t" : "1",
"n" : 500000
}
],
"des" : "intr_cszl_des_1"
},
"2": {
"pval" : 1,
"stype" : "101",
"cond": [],
"prize" : [
{
"a" : "item",
"t" : "1",
"n" : 500000
}
],
"des" : "intr_cszl_des_1"
},
"3": {
"pval" : 2,
"stype" : "101",
"cond": [],
"prize" : [
{
"a" : "item",
"t" : "1",
"n" : 500000
}
],
"des" : "intr_cszl_des_1"
}
},
"gameneed": [{"a": "attr", "t":"jinbi", "n": 1}],
"game": [0,1, 2, 3, 4, 5],
"gamefree": 3,
"zhanling":[{
"val": 1,
"pt": [{"a": "attr", "t":"jinbi", "n": 1}],
"gj": [{"a": "attr", "t":"jinbi", "n": 1},{"a": "attr", "t":"jinbi", "n": 1}]
},
{
"val": 2,
"pt": [{"a": "attr", "t":"rmbmoney", "n": 100}],
"gj": [{"a": "attr", "t":"rmbmoney", "n": 100},{"a": "attr", "t":"jinbi", "n": 1}]
},
{
"val": 3,
"pt": [{"a": "attr", "t":"jinbi", "n": 1}],
"gj": [{"a": "attr", "t":"jinbi", "n": 1},{"a": "attr", "t":"jinbi", "n": 1}]
},{
"val": 4,
"pt": [{"a": "attr", "t":"jinbi", "n": 1}],
"gj": [{"a": "attr", "t":"jinbi", "n": 1},{"a": "attr", "t":"jinbi", "n": 1}]
},
{
"val": 5,
"pt": [{"a": "attr", "t":"rmbmoney", "n": 100}],
"gj": [{"a": "attr", "t":"rmbmoney", "n": 100},{"a": "attr", "t":"jinbi", "n": 1}]
},
{
"val": 6,
"pt": [{"a": "attr", "t":"jinbi", "n": 1}],
"gj": [{"a": "attr", "t":"jinbi", "n": 1},{"a": "attr", "t":"jinbi", "n": 1}]
},{
"val": 7,
"pt": [{"a": "attr", "t":"jinbi", "n": 1}],
"gj": [{"a": "attr", "t":"jinbi", "n": 1},{"a": "attr", "t":"jinbi", "n": 1}]
},
{
"val": 8,
"pt": [{"a": "attr", "t":"rmbmoney", "n": 100}],
"gj": [{"a": "attr", "t":"rmbmoney", "n": 100},{"a": "attr", "t":"jinbi", "n": 1}]
},
{
"val": 9,
"pt": [{"a": "attr", "t":"jinbi", "n": 1}],
"gj": [{"a": "attr", "t":"jinbi", "n": 1},{"a": "attr", "t":"jinbi", "n": 1}]
}],
"zlpayid":"ycmb_1_1",
"libao": {
"1": {
"payid": "",
"buynum": 2,
"basep": [{"a": "attr", "t":"rmbmoney", "n": 1}],
"des" : "intr_cszl_des_1",
"dlz": [
{
"1": {"a": "attr", "t":"rmbmoney", "n": 1},
"2": {"a": "attr", "t":"rmbmoney", "n": 2},
"3": {"a": "attr", "t":"rmbmoney", "n": 3}
},
{
"1": {"a": "attr", "t":"rmbmoney", "n": 1},
"2": {"a": "attr", "t":"rmbmoney", "n": 2},
"3": {"a": "attr", "t":"rmbmoney", "n": 3}
}
]
},
"2": {
"payid": "ycmb_1_2",
"buynum": 2,
"basep": [{"a": "attr", "t":"rmbmoney", "n": 2}],
"des" : "intr_cszl_des_2",
"dlz": [
{
"1": {"a": "attr", "t":"rmbmoney", "n": 1},
"2": {"a": "attr", "t":"rmbmoney", "n": 2},
"3": {"a": "attr", "t":"rmbmoney", "n": 3}
},
{
"1": {"a": "attr", "t":"rmbmoney", "n": 1},
"2": {"a": "attr", "t":"rmbmoney", "n": 2},
"3": {"a": "attr", "t":"rmbmoney", "n": 3}
}
]
}
},
"qiandao": [
[{"a": "attr", "t":"jinbi", "n": 1}],
[{"a": "attr", "t":"jinbi", "n": 1}],
[{"a": "attr", "t":"jinbi", "n": 1}],
[{"a": "attr", "t":"jinbi", "n": 1}],
[{"a": "attr", "t":"jinbi", "n": 1}],
[{"a": "attr", "t":"jinbi", "n": 1}],
[{"a": "attr", "t":"jinbi", "n": 1}]
]
}
}

View File

@ -0,0 +1,8 @@
export type ReqOpen = {
hdid: number
}
export type ResOpen = {
sc: boolean // 自选奖励领取标识
buy: string[] // 特价礼包购买记录
}

View File

@ -0,0 +1,10 @@
import {prizeType} from "../../type";
export interface ReqReceive {
hdid: number
select: string[]
}
export interface ResReceive {
prize: prizeType[]
}

View File

@ -0,0 +1,12 @@
export type ReqCanReceive = {
activityId?: number;
};
export type ResCanReceive = {
payNum: number;
remaining?: number;
result: boolean;
price: number;
showOffList: any[];
gotAmount: number;
};

View File

@ -0,0 +1,9 @@
export type ReqReceive = {
activityId: number;
};
export type ResReceive = {
amount: number,
timesRemaining?: number;
showOff?: boolean;
};

View File

@ -0,0 +1,16 @@
/**
*
*/
export type ReqOpen = {
};
export type ResOpen = {
record:{
[k: string]: any;
}
buyLog:{
[k: string]: any;
}
};

View File

@ -0,0 +1,11 @@
/**
*
*/
export interface ReqReceive {
id: string
recId: string
}
export interface ResReceive {
}

View File

@ -0,0 +1,18 @@
/**
*
*/
export type ReqOpen = {
limit?: number
};
export type ResOpen = {
list: data[]
myData: data
};
type data = {
_id: string,
total: number,
rank: number,
player: any
}

View File

@ -51,9 +51,10 @@ export type hongdianKey =
| 'heishiMrjx' | 'heishiMrjx'
| 'weixiuchang' | 'weixiuchang'
| 'kaifujingsai' | 'kaifujingsai'
| 'zhoumolibao'; | 'zhoumolibao'
| 'pobinglibao'
| 'payForDiamond'
| 'leichonglibao';
export type hongdianVal = { export type hongdianVal = {
show?: boolean; show?: boolean;
// 看功能需要 // 看功能需要

View File

@ -0,0 +1 @@
export type MsgPushGiftChange = number;

View File

@ -0,0 +1,5 @@
export type ReqItemNoEnough = {
need: { a: string, t: string }
}
export type ResItemNoEnough = {}

View File

@ -0,0 +1,5 @@
import {Gift} from "../../../module/collection_pushgift";
export type ReqOpen = {}
export type ResOpen = { gifts: Gift[] }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
export interface ReqDot {
type: string,
data?: any
}
export interface ResDot {
}