HJ_Server/src/public/lingzhulaixi.ts
2023-12-26 18:57:23 +08:00

173 lines
5.9 KiB
TypeScript

import { OptionalId, UpdateFilter } from 'mongodb';
import { userInfo } from 'os';
import { ApiCall } from 'tsrpc';
import { formatNpcData } from '../shared/fightControl/fightFun';
import { lingzhulaixi_BossList, lingzhulaixi_BOSSmmMoRenZhi, lingzhulaixi_CiSHU, ResOpen } from '../shared/protocols/lingzhulaixi/PtlOpen';
import { prizeType } from '../shared/protocols/type';
import { PublicShared } from '../shared/public/public';
import { PayFun } from './pay';
import { PlayerFun } from './player';
export class LingZhuLaiXifun {
/**领主来袭配置 */
static async getCon(bid: string) {
let _con = G.gc.PiratesFight[bid]
return _con
}
/**获取boss最大血量 */
static async getBossMapHp(bid: string) {
let _con = await this.getCon(bid)
let _bossid = _con.army
let _res = await formatNpcData(_bossid)
let _keys = Object.keys(_res.roles)
let maxHp: number = 0
for (let index = 0; index < Object.keys(_res.roles).length; index++) {
const element = _keys[index];
maxHp += _res.roles[element].attr.hp
}
return maxHp
}
/**获取boss初始信息 */
static async getBossDataDef(bid: string) {
let _res: lingzhulaixi_BOSSmmMoRenZhi = {
bid: bid,
ctime: G.time,
passtime: 0,
maxhp: await this.getBossMapHp(bid),
pkuser: {},
delhp: 0,
randusernum: 0
}
return _res
}
/**设置boss相关信息 */
static async setBossData(bid: string, data: {}) {
await G.mongodb.collection('lingzhulaixi').updateOne({ bid: bid }, data, { upsert: true });
}
/**设置玩家相关信息 */
static async setMyData(call: ApiCall, data: {}) {
await G.mongodb.collection('playerInfo', 'lingzhulaixi').updateOne({ uid: call.uid, type: 'lingzhulaixi' }, data, { upsert: true });
}
/**获取boss信息 */
static async getBossData(bid: string) {
let _bossInfo = await G.mongodb.collection('lingzhulaixi').findOne({ bid: bid });
let _res: lingzhulaixi_BOSSmmMoRenZhi
if (!_bossInfo || (_bossInfo.passtime != 0 && G.time > _bossInfo.passtime)) {
_res = await this.getBossDataDef(bid)
await this.setBossData(bid, { $set: _res })
} else {
delete _bossInfo._id
_res = _bossInfo
}
return _res
}
/**获取玩家已经使用的挑战次数 以及挑战的最大伤害 */
static async getUsePKNum(call: ApiCall) {
let _myData = await G.mongodb.collection('playerInfo', 'lingzhulaixi').findOne({ uid: call.conn.uid, type: 'lingzhulaixi' })
let _res: lingzhulaixi_CiSHU
// 隔天清零
if (_myData && PublicShared.chkSameDate(_myData.time, G.time)) {
_res = {
num: _myData.num || 0,
time: _myData.time || G.time,
maxdps: _myData.maxdps || {}
}
} else {
_res = {
num: 0,
time: G.time,
maxdps: _myData?.maxdps || {}
}
}
return _res
}
/**格式化boss列表信息 */
static async fmtBossList(call: ApiCall) {
let _bossData = await G.mongodb.collection('lingzhulaixi').find({}).toArray()
let _res: lingzhulaixi_BossList = {}
for (let index = 0; index < _bossData.length; index++) {
const element = _bossData[index];
if (element.passtime != 0 && element.passtime < G.time) {
continue
}
let _tmp = {
bid: element.bid,
passtime: element.passtime,
maxhp: element.maxhp,
delhp: element.delhp,
pkusernum: Object.keys(element.pkuser).length + element.randusernum,
}
_res[element.bid] = _tmp
}
return _res
}
/**格式化boss列表信息 */
static async getBossFightInof(bossFightid: number | string, hpjc: number) {
let _res = await formatNpcData(bossFightid)
let _keys = Object.keys(_res.roles)
if (hpjc >= 1) return _res
for (let index = 0; index < Object.keys(_res.roles).length; index++) {
const element = _keys[index];
// @ts-ignore
let _tmpHp = parseInt(hpjc * _res.roles[element].attr.hp)
// @ts-ignore
// let _tmpMaxHp = parseInt(hpjc * _res.roles[element].attr.maxHp)
_res.roles[element].attr.hp = _tmpHp
// _res.roles[element].attr.maxHp = _tmpMaxHp
}
return _res
}
/**获取掉落组的奖励 */
static async getPrize(dlz: number[]) {
let prize = []; // 发送的奖励
for (let index = 0; index < dlz.length; index++) {
const element = dlz[index];
prize = prize.concat(PublicShared.randomDropGroup(element, 1));
}
return prize
}
/**排序 */
static async getRankList(pkuser: { [uid: string]: number }) {
let list = Object.keys(pkuser)
let fmtpkuser = []
for (let index = 0; index < list.length; index++) {
const element = pkuser[list[index]]
let d = {
uid: list[index],
maxdps: element
}
fmtpkuser.push(d)
}
// fmtpkuser.sort((a, b) => a.maxdps - b.maxdps)
fmtpkuser.sort((a, b) => b.maxdps - a.maxdps)
return fmtpkuser
}
/**红点 */
static async getHongDian(call: ApiCall) {
let _res = {
show: false
}
let _con = await this.getCon("1")
if (call.conn.gud.lv < _con.lv) return _res
let _myData = await this.getUsePKNum(call)
let _maxNum = G.gc.com.PiratesFight_ChallengesNum.value
if (_myData.num < _maxNum) {
_res.show = true
}
return _res
}
}