Merge branch 'bugfix' into release
This commit is contained in:
commit
ba978c827a
@ -11,4 +11,6 @@ WORKDIR /app
|
|||||||
|
|
||||||
RUN npm config set registry http://registry.npm.taobao.org/ && npm install pm2@5.2.2 -g
|
RUN npm config set registry http://registry.npm.taobao.org/ && npm install pm2@5.2.2 -g
|
||||||
|
|
||||||
|
RUN rm -rf node_modules/tsbuffer-validator/index.js && cp tsbufferIndex.js node_modules/tsbuffer-validator/index.js
|
||||||
|
|
||||||
CMD cd /app && sh zoeninfo.sh "Asia/Tokyo" && pm2-runtime start js_pm2.config.js -- ${Param}
|
CMD cd /app && sh zoeninfo.sh "Asia/Tokyo" && pm2-runtime start js_pm2.config.js -- ${Param}
|
||||||
|
@ -6,9 +6,9 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "tsrpc-cli dev",
|
"dev": "tsrpc-cli dev",
|
||||||
"build": "tsrpc-cli build && copy js_pm2.config.js dist && copy zoeninfo.sh dist && mkdir dist\\json && xcopy src\\json dist\\json /e ",
|
"build": "tsrpc-cli build && copy js_pm2.config.js dist && copy zoeninfo.sh dist && copy tsbufferIndex.js dist && mkdir dist\\json && xcopy src\\json dist\\json /e ",
|
||||||
"build_win": "tsrpc-cli build && copy js_pm2.config.js dist && copy zoeninfo.sh dist && mkdir dist\\json && xcopy src\\json dist\\json /e ",
|
"build_win": "tsrpc-cli build && copy js_pm2.config.js dist && copy zoeninfo.sh dist && copy tsbufferIndex.js dist && mkdir dist\\json && xcopy src\\json dist\\json /e ",
|
||||||
"build_linux": "tsrpc-cli build && cp js_pm2.config.js dist && cp zoeninfo.sh dist && cp src/json/ -a dist ",
|
"build_linux": "tsrpc-cli build && cp js_pm2.config.js dist && cp zoeninfo.sh dist && cp tsbufferIndex.js dist && cp src/json/ -a dist ",
|
||||||
"build_docker_win": "npm run build_win && cd dist && npm i --omit=dev",
|
"build_docker_win": "npm run build_win && cd dist && npm i --omit=dev",
|
||||||
"build_docker_linux": "npm run build_linux && cd dist && npm i --omit=dev",
|
"build_docker_linux": "npm run build_linux && cd dist && npm i --omit=dev",
|
||||||
"doc": "tsrpc-cli doc && node js_uploadDoc.js",
|
"doc": "tsrpc-cli doc && node js_uploadDoc.js",
|
||||||
|
@ -50,19 +50,44 @@ export default async function (call: ApiCall<ReqOpen, ResOpen>) {
|
|||||||
call.succ(db as any);
|
call.succ(db as any);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function refreshEnemys(call: ApiCall) {
|
let lastRefreshTime: number
|
||||||
let section = [call.conn.gud.mapId - 8, call.conn.gud.mapId + 8];
|
let enemyObject: object = {}
|
||||||
//let allUser = Object.values(await G.redis.get('user')).filter(u => u.mapId >= section[0] && u.mapId <= section[1] && u.uid != call.uid);
|
|
||||||
//let dbUser = await G.mongodb.collection('wanted').find({uid: {$in: allUser.map(u => u.uid)}}).toArray();
|
|
||||||
|
|
||||||
let allUser = await G.mongodb.find('user', {
|
/**
|
||||||
|
* 每小时刷新公路狂飙用户,功能超过30级开放,只查询30级以上的用户,超过80级的,80级到100级为一档
|
||||||
|
*/
|
||||||
|
async function checkAndRefreshEnemy() {
|
||||||
|
if (lastRefreshTime + 3600 > G.time) return
|
||||||
|
lastRefreshTime = G.time
|
||||||
|
for (let i = 3; i <= 8; i++) {
|
||||||
|
let users = await G.mongodb.collection('user').aggregate([
|
||||||
|
{
|
||||||
|
$match: {
|
||||||
$and: [
|
$and: [
|
||||||
{mapId: {$gte: section[0]}},
|
{lv: {$gte: i * 10}},
|
||||||
{mapId: {$lte: section[1]}},
|
{lv: {$lt: i == 8 ? 101 : (i + 1) * 10}},
|
||||||
{uid: {$ne: call.uid}}
|
|
||||||
]
|
]
|
||||||
}, ['uid']);
|
}
|
||||||
let dbUser = await G.mongodb.find('wanted', {uid: {$in: allUser.map(u => u.uid)}}, ['uid', 'wanted']);
|
},
|
||||||
|
{
|
||||||
|
$project: {uid: 1}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$sample: {size: 100}
|
||||||
|
}
|
||||||
|
]).toArray()
|
||||||
|
let dbUser = await G.mongodb.find('wanted', {uid: {$in: users.map(u => u.uid)}}, ['uid', 'wanted']);
|
||||||
|
|
||||||
|
enemyObject[i] = dbUser || []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function refreshEnemys(call: ApiCall) {
|
||||||
|
if (!lastRefreshTime) await checkAndRefreshEnemy()
|
||||||
|
|
||||||
|
let lvDw = Math.floor(call.conn.gud.lv / 10 > 8 ? 8 : call.conn.gud.lv / 10)
|
||||||
|
|
||||||
|
let dbUser = enemyObject[lvDw] || []
|
||||||
|
|
||||||
let enemys: joinFightData[] = [];
|
let enemys: joinFightData[] = [];
|
||||||
|
|
||||||
@ -74,7 +99,6 @@ export async function refreshEnemys(call: ApiCall) {
|
|||||||
let filter = dbUser.filter(u => conf.need <= u.wanted && u.wanted < needMax);
|
let filter = dbUser.filter(u => conf.need <= u.wanted && u.wanted < needMax);
|
||||||
let uids = filter.map(f => f.uid);
|
let uids = filter.map(f => f.uid);
|
||||||
dbUser.remove(u => uids.includes(u.uid));
|
dbUser.remove(u => uids.includes(u.uid));
|
||||||
let a = configs[0].npc.random()
|
|
||||||
let enemy = uids.length > 0 ? await FightFun.getPlayerFightData(uids.random()) : formatNpcData(configs[0].npc.random());
|
let enemy = uids.length > 0 ? await FightFun.getPlayerFightData(uids.random()) : formatNpcData(configs[0].npc.random());
|
||||||
if (!enemy) enemy = formatNpcData(configs[0].npc.random())
|
if (!enemy) enemy = formatNpcData(configs[0].npc.random())
|
||||||
if (enemy.player.isNpc) enemy.player.name = G.gc.gonglukuangbiao.npcname.random()
|
if (enemy.player.isNpc) enemy.player.name = G.gc.gonglukuangbiao.npcname.random()
|
||||||
@ -83,7 +107,7 @@ export async function refreshEnemys(call: ApiCall) {
|
|||||||
PublicShared.randomNum(G.gc.gonglukuangbiao.wanted[0].wanted[0], G.gc.gonglukuangbiao.wanted[0].wanted[1])
|
PublicShared.randomNum(G.gc.gonglukuangbiao.wanted[0].wanted[0], G.gc.gonglukuangbiao.wanted[0].wanted[1])
|
||||||
enemys.push(enemy);
|
enemys.push(enemy);
|
||||||
}
|
}
|
||||||
|
checkAndRefreshEnemy()
|
||||||
return enemys.reverse();
|
return enemys.reverse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ let uid2processId = {};
|
|||||||
//订阅redis
|
//订阅redis
|
||||||
let subscribeRedis: RedisClientType
|
let subscribeRedis: RedisClientType
|
||||||
let firstPid = null;
|
let firstPid = null;
|
||||||
|
|
||||||
//发布和可写redis复用原 setRedis 里的redisClient
|
//发布和可写redis复用原 setRedis 里的redisClient
|
||||||
|
|
||||||
|
|
||||||
@ -43,14 +44,19 @@ export function clusterPublish(key: string, data: any) {
|
|||||||
* 在集群的N个进程中,只运行一次,在业务逻辑中也可使用
|
* 在集群的N个进程中,只运行一次,在业务逻辑中也可使用
|
||||||
*/
|
*/
|
||||||
export function clusterRunOnce(fun) {
|
export function clusterRunOnce(fun) {
|
||||||
|
console.log(`${process.pid}环境变量pm_id===>${process.env.pm_id}`);
|
||||||
if (process.env.pm_id == null || process.env.pm_id === '0') {
|
if (process.env.pm_id == null || process.env.pm_id === '0') {
|
||||||
//非pm2启动的,或是pm2下启动的第一个进程
|
//非pm2启动的,或是pm2下启动的第一个进程
|
||||||
|
console.log("run clusterRunOnce1 ===>", process.pid)
|
||||||
fun();
|
fun();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(G.config.isG123)return;
|
||||||
|
|
||||||
if (firstPid == process.pid) {
|
if (firstPid == process.pid) {
|
||||||
//pm2的其中一个进程
|
//pm2的其中一个进程
|
||||||
|
console.log("run clusterRunOnce2 ===>", process.pid)
|
||||||
fun();
|
fun();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -22,12 +22,15 @@ export class CrossEmailPull extends Scheduler {
|
|||||||
G.clientCross.callApi("email/GetCrossEmail", {server_id: G.config.serverId + ""}).then((res) => {
|
G.clientCross.callApi("email/GetCrossEmail", {server_id: G.config.serverId + ""}).then((res) => {
|
||||||
if (!res.isSucc) return;
|
if (!res.isSucc) return;
|
||||||
res.res.emails.forEach(async (email) => {
|
res.res.emails.forEach(async (email) => {
|
||||||
|
let _prize = email?.prizeData?.prize || [];
|
||||||
|
if (email?.prizeData) delete email.prizeData;
|
||||||
|
|
||||||
|
email["prize"] = _prize;
|
||||||
if (email.uid != "system") {
|
if (email.uid != "system") {
|
||||||
await EmailFun.addEmail(email)
|
await EmailFun.addEmail(email)
|
||||||
} else {
|
} else {
|
||||||
await EmailFun.addQuanFuEmail(email)
|
await EmailFun.addQuanFuEmail(email)
|
||||||
}
|
}
|
||||||
await EmailFun.addEmail(email)
|
|
||||||
})
|
})
|
||||||
if (res.res.emails.length > 0) {
|
if (res.res.emails.length > 0) {
|
||||||
G.clientCross.callApi("email/DelCrossEmail", {eids: res.res.emails.map(e => e._id)})
|
G.clientCross.callApi("email/DelCrossEmail", {eids: res.res.emails.map(e => e._id)})
|
||||||
|
@ -788,7 +788,7 @@ export class TaskAllEmitFun {
|
|||||||
let _val = node.call.req.num;
|
let _val = node.call.req.num;
|
||||||
G.emit("Class_task_136", 'Class_task_136', node.call, _val, 0);
|
G.emit("Class_task_136", 'Class_task_136', node.call, _val, 0);
|
||||||
// todo 统计藏品修复胶,此处只是临时处理,防止线上任务数据出错,正确做法是,统计修复胶的消耗,走136任务的统计
|
// todo 统计藏品修复胶,此处只是临时处理,防止线上任务数据出错,正确做法是,统计修复胶的消耗,走136任务的统计
|
||||||
G.emit("Class_task_134", 'Class_task_134', node.call, _val, 0, {});
|
G.emit("Class_task_134", 'Class_task_134', node.call, _val, 0, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.call.service.name == 'peijian/LvUp' && node.return.isSucc) {
|
if (node.call.service.name == 'peijian/LvUp' && node.return.isSucc) {
|
||||||
|
@ -390,8 +390,11 @@ export module manager {
|
|||||||
|
|
||||||
async initVal(call: ApiCall, con) {
|
async initVal(call: ApiCall, con) {
|
||||||
const data = await TanXianFun.getData(call);
|
const data = await TanXianFun.getData(call);
|
||||||
|
if (data?.resetTime > PublicShared.getToDayZeroTime()) {
|
||||||
return data.useFastGuaJiNum || 0
|
return data.useFastGuaJiNum || 0
|
||||||
}
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第25个任务 竞技场中挑战 n 次对手
|
// 第25个任务 竞技场中挑战 n 次对手
|
||||||
@ -401,8 +404,11 @@ export module manager {
|
|||||||
|
|
||||||
async initVal(call: ApiCall, con) {
|
async initVal(call: ApiCall, con) {
|
||||||
let data = await JJCFun.getData(call);
|
let data = await JJCFun.getData(call);
|
||||||
|
if (data?.resetTime >= PublicShared.getToDayZeroTime()) {
|
||||||
return data?.useFightNum || 0
|
return data?.useFightNum || 0
|
||||||
}
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第26个任务 斩草除根进行 n 次通关或扫荡
|
// 第26个任务 斩草除根进行 n 次通关或扫荡
|
||||||
@ -418,8 +424,11 @@ export module manager {
|
|||||||
|
|
||||||
async initVal(call: ApiCall, con) {
|
async initVal(call: ApiCall, con) {
|
||||||
let myData = await G.mongodb.cPlayerInfo('meirishilian').findOne({uid: call.uid, type: 'meirishilian'});
|
let myData = await G.mongodb.cPlayerInfo('meirishilian').findOne({uid: call.uid, type: 'meirishilian'});
|
||||||
|
if (myData.data.refreshTime > PublicShared.getToDayZeroTime()) {
|
||||||
return R.compose(R.sum(), R.map(i => i[0].useFightNum), R.values())(myData.data.numInfo) || 0
|
return R.compose(R.sum(), R.map(i => i[0].useFightNum), R.values())(myData.data.numInfo) || 0
|
||||||
}
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第28个任务 地盘争夺抢夺或战领 n 次
|
// 第28个任务 地盘争夺抢夺或战领 n 次
|
||||||
@ -435,7 +444,10 @@ export module manager {
|
|||||||
|
|
||||||
async initVal(call: ApiCall, con) {
|
async initVal(call: ApiCall, con) {
|
||||||
let myData = await G.mongodb.cPlayerInfo('qjzzd').findOne({uid: call.uid, type: 'qjzzd'});
|
let myData = await G.mongodb.cPlayerInfo('qjzzd').findOne({uid: call.uid, type: 'qjzzd'});
|
||||||
return myData.useFightNum || 0
|
if (myData?.refreFightTime > PublicShared.getToDayZeroTime()) {
|
||||||
|
return myData?.useFightNum || 0
|
||||||
|
}
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,8 +503,11 @@ export module manager {
|
|||||||
|
|
||||||
async initVal(call: ApiCall, con) {
|
async initVal(call: ApiCall, con) {
|
||||||
let data: Partial<CollectionWanted> = await G.mongodb.collection('wanted').findOne({uid: call.uid}) || {};
|
let data: Partial<CollectionWanted> = await G.mongodb.collection('wanted').findOne({uid: call.uid}) || {};
|
||||||
|
if (data.refreshTime > PublicShared.getToDayZeroTime()) {
|
||||||
return data.toDayUseNum || 0
|
return data.toDayUseNum || 0
|
||||||
}
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第35个任务 进行 x 教会招募
|
// 第35个任务 进行 x 教会招募
|
||||||
@ -766,6 +781,7 @@ export module manager {
|
|||||||
return call.conn.gud?.helpHeros?.length || 0;
|
return call.conn.gud?.helpHeros?.length || 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第56个任务 完成圣诞活动小游戏
|
// 第56个任务 完成圣诞活动小游戏
|
||||||
export class Class_task_154 extends BaseClass {
|
export class Class_task_154 extends BaseClass {
|
||||||
stype = 154
|
stype = 154
|
||||||
@ -775,6 +791,7 @@ export module manager {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第57个任务 领取每日任务最终宝箱
|
// 第57个任务 领取每日任务最终宝箱
|
||||||
export class Class_task_155 extends BaseClass {
|
export class Class_task_155 extends BaseClass {
|
||||||
stype = 155
|
stype = 155
|
||||||
|
@ -182,6 +182,18 @@ export function getBuffDPS(toRole: FightObj, fromRole: FightObj, extData: { xiao
|
|||||||
// todo 主角技能还没有限制百分比的最大伤害,以下判断修复技能buff没有伤害
|
// todo 主角技能还没有限制百分比的最大伤害,以下判断修复技能buff没有伤害
|
||||||
if (fromRole.getData('pos') != 7){
|
if (fromRole.getData('pos') != 7){
|
||||||
dps = dps > maxDps ? maxDps : dps;
|
dps = dps > maxDps ? maxDps : dps;
|
||||||
|
} else {
|
||||||
|
// 主角技能伤害最大值: avg(所有上场干部的maxDps) * 2
|
||||||
|
let sumHeroMaxDps = 0, heroCount = 0;
|
||||||
|
const fromRoleSide = fromRole.getData('side');
|
||||||
|
fromRole.fightControl.fightRolesArr.forEach(role => {
|
||||||
|
if (role.getData('pos') < 7 && role.getData('side') === fromRoleSide) {
|
||||||
|
sumHeroMaxDps += role.getData('maxdps');
|
||||||
|
heroCount++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
maxDps = sumHeroMaxDps / heroCount * 2;
|
||||||
|
dps = dps > maxDps ? maxDps : dps;
|
||||||
}
|
}
|
||||||
|
|
||||||
return { num: -dps, dps: -dps, miss: miss, baoji: baoji, fromRole: fromRole, toRole: toRole };
|
return { num: -dps, dps: -dps, miss: miss, baoji: baoji, fromRole: fromRole, toRole: toRole };
|
||||||
|
1122
tsbufferIndex.js
Normal file
1122
tsbufferIndex.js
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user