HJ_Server/src/public/kuangdong.ts
2023-12-15 16:41:31 +08:00

265 lines
8.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}