265 lines
8.6 KiB
TypeScript
265 lines
8.6 KiB
TypeScript
import {OptionalId, UpdateFilter} from 'mongodb';
|
||
import {userInfo} from 'os';
|
||
import {ApiCall} from 'tsrpc';
|
||
import {CollectionPlayerInfo} from '../module/collection_palyerInfo';
|
||
import {
|
||
KuangDongCiShuInfo,
|
||
KuangDongKaiCaiList,
|
||
KuangDongKaiCaiListTmp,
|
||
KuangDongKaiCailog,
|
||
KuangDongKuang
|
||
} from '../shared/protocols/kuangdong/PtlOpen';
|
||
import {prizeType} from '../shared/protocols/type';
|
||
import {PublicShared} from '../shared/public/public';
|
||
import {PayFun} from './pay';
|
||
import {PlayerFun} from './player';
|
||
import { getGud } from './gud';
|
||
|
||
|
||
export class KuangDongfun {
|
||
/**矿洞配置 */
|
||
static async getCon(hdid: string | number) {
|
||
let _con = G.gc.land[hdid.toString()]
|
||
return _con
|
||
}
|
||
|
||
/**次数相关初始数据 */
|
||
static async initData() {
|
||
let _res: KuangDongCiShuInfo = {
|
||
eara: {},
|
||
buynum: {},
|
||
time: G.time
|
||
}
|
||
return _res
|
||
}
|
||
|
||
/**获取基础数据次数 */
|
||
static async getNumInfo(call: ApiCall) {
|
||
let result = await G.mongodb.collection('playerInfo', 'kuangdong').findOne({uid: call.uid, type: 'kuangdong'});
|
||
let _res: KuangDongCiShuInfo
|
||
if (result && PublicShared.chkSameDate(result.time, G.time)) {
|
||
_res = {
|
||
eara: result?.eara || {},
|
||
buynum: result?.buynum || {},
|
||
time: result.time
|
||
}
|
||
} else {
|
||
_res = await this.initData()
|
||
}
|
||
return _res
|
||
}
|
||
|
||
/**占领矿 */
|
||
static async miningZhanLing(call: ApiCall, hdid: number) {
|
||
let _con = await this.getCon(hdid)
|
||
let _tmp: KuangDongKuang
|
||
let _et = G.time + 8 * 3600
|
||
_tmp = {
|
||
ctime: G.time,
|
||
etime: _et,
|
||
uid: call.uid,
|
||
yanshi: 0,
|
||
hdid: hdid,
|
||
kdtype: _con["type"],
|
||
ttl: new Date()
|
||
}
|
||
await this.setminingZhanLing(call.uid, hdid, {$set: _tmp})
|
||
return _tmp
|
||
}
|
||
|
||
/**修改矿洞数据 */
|
||
static async setminingZhanLing(uid: string, hdid: number, update) {
|
||
G.mongodb.collection('kuangdong').updateOne(
|
||
{
|
||
uid: uid,
|
||
hdid: hdid
|
||
},
|
||
{
|
||
...update
|
||
},
|
||
{
|
||
upsert: true
|
||
}
|
||
);
|
||
}
|
||
|
||
/**获取所有矿洞信息 */
|
||
static async getKaiCaiList(uid: string) {
|
||
let _r = {}
|
||
let _res: {
|
||
[hdid: string]: KuangDongKaiCaiList;
|
||
} = {}
|
||
let private_hdid = []
|
||
// 排除 非公共街道的数据
|
||
for (let grid in G.gc.land) {
|
||
if (G.gc.land[grid].public_map != 1) {
|
||
private_hdid.push(Number(grid))
|
||
}
|
||
}
|
||
//这里总共极限是63条数据
|
||
let _kdList = await G.mongodb.collection('kuangdong').find({
|
||
$or: [{hdid: {$nin: private_hdid}}, {uid: uid}]
|
||
}).toArray();
|
||
|
||
//从kdlist中筛选出uid字段
|
||
let uids = _kdList.map(item => item.uid);
|
||
|
||
let userInfos;
|
||
if (uids.length > 0) {
|
||
//一次性拉取所有玩家
|
||
userInfos = await this.getUserInfo(uids)
|
||
}
|
||
|
||
let _prize = {}
|
||
for (let index = 0; index < _kdList.length; index++) {
|
||
const element = _kdList[index];
|
||
let _hdid = element.hdid
|
||
// 时间到直接结算奖励
|
||
if (element.etime + element.yanshi <= G.time) {
|
||
let _p = await this.getKuangDongPrize(_hdid, element)
|
||
if (!_prize[element.uid]) _prize[element.uid] = []
|
||
_prize[element.uid] = _prize[element.uid].concat(_p)
|
||
continue
|
||
}
|
||
element._id = element._id.toString()
|
||
//let _tmp = await this.getUserInfo(element.uid)
|
||
element.userinfo = (userInfos?.[element.uid] || {}) as any;
|
||
_res[_hdid.toString()] = element
|
||
}
|
||
_r["kdinfo"] = _res
|
||
_r["prize"] = _prize
|
||
return _r
|
||
}
|
||
|
||
/**获取个人信息 */
|
||
static async getUserInfo(uid: string | string[]) {
|
||
let _tmp: KuangDongKaiCaiListTmp
|
||
let uids = [];
|
||
|
||
if (typeof (uid) == 'string') {
|
||
//兼容原来的逻辑,保持对string的支持
|
||
uids = [uid]
|
||
} else {
|
||
uids = uid;
|
||
}
|
||
let info = {};
|
||
let _guds = await G.mongodb.find('user', {uid: {$in: uids}}, ['uid', 'name', 'lv', 'power', 'ghId', 'ghName', 'head', 'headFrame']);
|
||
_guds.forEach(v => {
|
||
info[v.uid] = {
|
||
name: v.name,
|
||
lv: v.lv,
|
||
power: v.power,
|
||
ghId: v.ghId,
|
||
ghName: v.ghName,
|
||
head: v.head,
|
||
headFrame: v.headFrame
|
||
}
|
||
});
|
||
|
||
if (typeof (uid) == 'string') {
|
||
//兼容原来的逻辑,保持对string的支持
|
||
return info[uid] as any;
|
||
} else {
|
||
return info;
|
||
}
|
||
}
|
||
|
||
/**获取矿洞的详细信息 */
|
||
static async getKaiCaiInfo(hdid: number, uid: string = '') {
|
||
let _where = {hdid: hdid}
|
||
if (uid) _where["uid"] = uid
|
||
let _kdInfo = await G.mongodb.collection('kuangdong').findOne(_where)
|
||
return _kdInfo
|
||
}
|
||
|
||
/**获取矿洞奖励 */
|
||
static async getKuangDongPrize(hdid: number, kdInfo?: KuangDongKuang, data?: {}) {
|
||
if (!kdInfo) {
|
||
kdInfo = await this.getKaiCaiInfo(hdid)
|
||
}
|
||
if (!kdInfo) return []
|
||
let _con = await this.getCon(hdid)
|
||
let _kcTime = G.time + kdInfo.yanshi - kdInfo.ctime
|
||
//let _gud = await G.mongodb.collection('user').findOne({uid: kdInfo.uid})
|
||
let _gud = await getGud(kdInfo.uid)
|
||
let gamer_lv = _gud.lv
|
||
// @ts-ignore
|
||
let prize: prizeType[] = _con.reward
|
||
// let prize: prizeType[] = [{ a: 'attr', t: 'rmbmoney', n: 50 }] // todo 待接入配置
|
||
if (_kcTime > 8 * 3600) _kcTime = 8 * 3600 + kdInfo.yanshi // 设置最大时长
|
||
prize[0]["n"] = Math.floor(eval(_con.formula) * _kcTime)
|
||
|
||
if (_con.public_map == 1){
|
||
await G.mongodb.collection('kuangdong').deleteOne({hdid: hdid})
|
||
}else {
|
||
await G.mongodb.collection('kuangdong').deleteOne({hdid: hdid, uid: kdInfo.uid})
|
||
}
|
||
if (prize[0]["n"] > 0) {
|
||
// 发奖删数据加日志
|
||
PlayerFun.sendPrize(PayFun.getCall(_gud), prize)
|
||
} else {
|
||
prize = []
|
||
}
|
||
|
||
// 矿洞日志
|
||
let _log: KuangDongKaiCailog = {
|
||
uid: kdInfo.uid,
|
||
hdid: hdid,
|
||
name: _gud.name,
|
||
ctime: G.time,
|
||
msgtype: 1,
|
||
prize: prize,
|
||
longtime: _kcTime
|
||
}
|
||
Object.assign(_log, data)
|
||
await this.newKuangDongLog(_log)
|
||
return prize
|
||
}
|
||
|
||
/**添加矿洞日志 */
|
||
static async newKuangDongLog(sendData: KuangDongKaiCailog) {
|
||
sendData.longtime = (sendData.longtime < 8 * 3600) ? sendData.longtime : 8 * 3600
|
||
const msgListLen = 20
|
||
// let conns = G.server.connections;
|
||
G.mongodb.collection('ghbzcjlog').updateOne(
|
||
{type: "kuangdong_msg"},
|
||
{$push: {list: {$each: [sendData], $slice: -msgListLen}}},
|
||
{upsert: true}
|
||
);
|
||
// G.server.broadcastMsg('msg_s2c/GongHuiBaoZang', [sendData], conns);
|
||
}
|
||
|
||
/**红点 */
|
||
static async getHongDian(call: ApiCall) {
|
||
let _res = {
|
||
show: false
|
||
}
|
||
// 次数信息
|
||
let _mydata = await this.getNumInfo(call)
|
||
// 配置可挑战次数
|
||
let _fightNumCon = G.gc.com.TerritoryFight_ChallengesNum.value
|
||
|
||
// 2023.8.29 策划新加 所有矿所有区域,总次数限制(目前各区域一次,总3次)
|
||
let _allAreaDayNum = G.gc.com.dpzd_quyu_num.value
|
||
let _mykdList = await G.mongodb.collection('kuangdong').find({uid: call.uid}).toArray()
|
||
let _tqNum = Object.keys(call.conn.gud.shoucangping).indexOf("4") != -1 ? 1 : 0
|
||
if (_mykdList.length >= _allAreaDayNum + _tqNum) {
|
||
return _res;
|
||
}
|
||
|
||
const _area = [1, 2, 3]
|
||
for (let index = 0; index < _area.length; index++) {
|
||
const element = _area[index];
|
||
// 购买次数
|
||
let _buyNum = _mydata.buynum?.[element] || 0
|
||
// 已挑战次数
|
||
let _fightNum = _mydata.eara?.[element] || 0
|
||
// 挑战次数不足
|
||
if (_fightNumCon + _buyNum > _fightNum) {
|
||
_res.show = true
|
||
break
|
||
}
|
||
}
|
||
return _res
|
||
}
|
||
} |