416 lines
14 KiB
TypeScript
416 lines
14 KiB
TypeScript
import SKDataUtil from "../gear/SKDataUtil";
|
||
import {MsgCode, Operate} from "../role/EEnum";
|
||
import * as schedule from "node-schedule";
|
||
import DB from "../utils/DB";
|
||
import ChargeSum from "../core/ChargeSum";
|
||
import GameUtil from "../core/GameUtil";
|
||
import PlayerMgr from "../object/PlayerMgr";
|
||
import GTimer from "../common/GTimer";
|
||
import SKCxfUtil from "../gear/SKCxfUtil";
|
||
|
||
|
||
/**
|
||
* 点券兑换
|
||
*/
|
||
export default class Currency {
|
||
|
||
static shared = new Currency();
|
||
|
||
// 当前额度
|
||
quota: number;
|
||
// 每天最大奖励总金额
|
||
maxQuota: number;
|
||
// 活动状态(1 开启 0 关闭)
|
||
state: number;
|
||
|
||
// 角色剩余点券
|
||
mapCurrencyRole: Map<number, number>;
|
||
// 角色兑换订单
|
||
mapCurrencyRoleOrder: Map<number, any>;
|
||
// 奖励数据
|
||
award: any [];
|
||
// 区组及爆率
|
||
oddsMap: Map<number, number>;
|
||
|
||
constructor() {
|
||
this.state = 0;
|
||
this.quota = 0;
|
||
this.maxQuota = 500;
|
||
this.mapCurrencyRole = new Map<number, number>();
|
||
this.mapCurrencyRoleOrder = new Map<number, any[]>();
|
||
this.award = [];
|
||
this.oddsMap = new Map<number, number>();
|
||
}
|
||
|
||
init() {
|
||
this.award = [{"name": "1", "prop": 1}, {"name": "0.8", "prop": 2}, {"name": "0.5", "prop": 3}, {
|
||
"name": "0.3",
|
||
"prop": 5
|
||
}, {"name": "0.2", "prop": 6}, {"name": "0.1", "prop": 83}];
|
||
// 读取数据
|
||
DB.selectConfiguration("currency_" + GameUtil.serverId, (code: any, info: any) => {
|
||
if (info && MsgCode.SUCCESS == code) {
|
||
let data = SKDataUtil.jsonBy(info.value_data);
|
||
this.quota = data.quota;
|
||
this.state = data.state;
|
||
this.maxQuota = data.maxQuota;
|
||
}
|
||
});
|
||
|
||
// 玩家剩余余额
|
||
DB.selectCurrencyRole((code: any, info: any) => {
|
||
if (MsgCode.SUCCESS == code) {
|
||
for (let i = 0; i < info.length; i++) {
|
||
this.mapCurrencyRole.set(info[i].roleid, info[i].money);
|
||
}
|
||
}
|
||
});
|
||
|
||
// 玩家提现记录
|
||
DB.selectCurrencyWithdraw((code: any, info: any) => {
|
||
if (MsgCode.SUCCESS == code) {
|
||
for (let i = 0; i < info.length; i++) {
|
||
let data: any = info[i];
|
||
let list: any[] = this.mapCurrencyRoleOrder.get(data.roleid);
|
||
if (list == undefined || list == null) {
|
||
list = [];
|
||
}
|
||
list.push(data);
|
||
this.mapCurrencyRoleOrder.set(data.roleid, list);
|
||
}
|
||
}
|
||
});
|
||
|
||
// 每天晚上12点更新 当前额度
|
||
schedule.scheduleJob("0 0 0 * * ?", () => {
|
||
this.quota = 100;
|
||
this.save();
|
||
});
|
||
|
||
// 一区几率(100)
|
||
this.oddsMap.set(1000, 100);
|
||
// // 二区几率
|
||
// this.oddsMap.set(1001,100);
|
||
// // 三区几率
|
||
// this.oddsMap.set(1002,100);
|
||
|
||
// let list: any = [];
|
||
// let list2: any = [];
|
||
// for (let i = 0; i < 100; i++) {
|
||
// let a = Number((100 / 1000 + 3000 / 1000 / 100).toFixed(2))
|
||
// let flag = this.getRandom(a);
|
||
// if (flag){
|
||
// list.push(1);
|
||
// }else {
|
||
// list2.push(2);
|
||
// }
|
||
// }
|
||
// console.log("list",list.length)
|
||
// console.log("list2",list2.length)
|
||
|
||
}
|
||
|
||
/**
|
||
* 获取爆率信息
|
||
*/
|
||
mondrop(player: any) {
|
||
let chargeTotal: any = ChargeSum.shared.getPlayerChargeSum(player.roleid);
|
||
let zone: any = 0;
|
||
let charge: number = 0;
|
||
zone = this.oddsMap.get(GameUtil.serverId);
|
||
if (zone != null && zone != undefined) {
|
||
charge = Number((zone / 100 + chargeTotal / 1000).toFixed(2));
|
||
}
|
||
player.send("s2c_mondrop", {
|
||
mondrop: charge.toString(),
|
||
zone: zone.toFixed(2)
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 获得点券奖励
|
||
*/
|
||
obtain_currency(player: any, task_name: string) {
|
||
if (this.state != 0) {
|
||
if (this.quota < this.maxQuota) {
|
||
// 计算几率
|
||
if (this.obtain(player)) {
|
||
// 本次获得金额
|
||
let money = this.probability();
|
||
// 获取余额
|
||
let balance = this.mapCurrencyRole.get(player.roleid);
|
||
if (balance != undefined && balance != null) {
|
||
balance += money;
|
||
} else {
|
||
balance = money;
|
||
}
|
||
// 重新存储
|
||
this.mapCurrencyRole.set(player.roleid, balance);
|
||
// 发送公告
|
||
let strRichText = `恭喜玩家在完成<color=#04eb5c >${task_name}</c >: <color=#ffffff >获得 </c >【<color=#f09600 >${money}</color >元】提现金奖励,真实可喜可贺呀!</c >`;
|
||
// let strRichText = `恭喜玩家<color=#04eb5c >${player.name}</c >在完成<color=#04eb5c >${task_name}</c >: <color=#ffffff >获得 </c >【<color=#f09600 >${money}</color >元】提现金奖励,真实可喜可贺呀!</c >`;
|
||
PlayerMgr.shared.broadcast('s2c_screen_msg', {
|
||
strRichText: strRichText,
|
||
bInsertFront: 0
|
||
});
|
||
// PlayerMgr.shared.broadcast('s2c_game_chat', {
|
||
// msg: strRichText,
|
||
// scale: 3
|
||
// });
|
||
this.quota += money;
|
||
// 同步数据库
|
||
this.update_currency_role(player.roleid, balance);
|
||
SKCxfUtil.getCxfCurrencyOperate({
|
||
roleId: player.roleid,
|
||
roleName: player.name,
|
||
operateType: Operate.PLAYER,
|
||
operateDepict: "获得点券奖励",
|
||
operateResSerial: player.roleid,
|
||
operateResName: `本次获得:${money}`,
|
||
operateContent: `本次获得:${money} 余额:${balance},总量:${this.quota} - ${this.maxQuota}`
|
||
});
|
||
this.save();
|
||
return;
|
||
}
|
||
}
|
||
return;
|
||
} else {
|
||
// player.send_notice("当前活动以关闭!")
|
||
return;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取点券几率
|
||
* @param player
|
||
*/
|
||
obtain(player: any): boolean {
|
||
let chargeTotal: any = ChargeSum.shared.getPlayerChargeSum(player.roleid);
|
||
let obtain: any = this.oddsMap.get(GameUtil.serverId);
|
||
return this.getRandom(Number((obtain / 1000 + chargeTotal / 1000 / 100).toFixed(2)));
|
||
}
|
||
|
||
/**
|
||
* 提现数据详情
|
||
* @param player
|
||
*/
|
||
information(player: any) {
|
||
// 获取余额
|
||
let balance = this.mapCurrencyRole.get(player.roleid);
|
||
if (balance == undefined && balance == null) {
|
||
balance = 0;
|
||
}
|
||
// 提现数据
|
||
let info: any = this.mapCurrencyRoleOrder.get(player.roleid);
|
||
if (info == null || info == undefined) {
|
||
info = [];
|
||
}
|
||
// 通知前端
|
||
player.send("s2c_information", {
|
||
balance: balance,
|
||
withdraw: SKDataUtil.toJson(info, "[]")
|
||
})
|
||
// 同步数据库
|
||
this.update_currency_role(player.roleid, balance);
|
||
}
|
||
|
||
/**
|
||
* 提现
|
||
*/
|
||
withdraw(player: any, data: any) {
|
||
if (this.state != 0) {
|
||
// 获取当前剩余金额
|
||
let money = this.mapCurrencyRole.get(player.roleid);
|
||
if (data.money <= money) {
|
||
// 提现后剩余金额
|
||
money -= data.money;
|
||
this.mapCurrencyRole.set(player.roleid, money);
|
||
let serial: any = SKDataUtil.rolePrimaryKey(10);
|
||
// 同步记录数据
|
||
let info: any = {
|
||
serial: serial,
|
||
roleid: player.roleid,
|
||
alipay: data.alipay,
|
||
name: data.name,
|
||
money: data.money,
|
||
req_time: GTimer.getTimeFormat(),
|
||
state: 0
|
||
};
|
||
this.withdraw_res(player, info);
|
||
// 同步数据库
|
||
DB.insertCurrencyWithdraw(info, money);
|
||
player.send_notice("您的提现以提交我们将在次日晚上23:00之前打到您的账户");
|
||
return;
|
||
} else {
|
||
player.send_notice("提现金额不能大于剩余金额(" + money + "元)");
|
||
return;
|
||
}
|
||
}
|
||
player.send_notice("当前活动以关闭!")
|
||
return;
|
||
}
|
||
|
||
|
||
/**
|
||
* 提现写入数据并且通知前端
|
||
* @param player
|
||
* @param data
|
||
*/
|
||
withdraw_res(player: any, data: any) {
|
||
let info: any = this.mapCurrencyRoleOrder.get(data.roleid);
|
||
if (info == null || info == undefined) {
|
||
info = [];
|
||
}
|
||
info.push(data);
|
||
this.mapCurrencyRoleOrder.set(data.roleid, info);
|
||
// 通知前端
|
||
this.information(player);
|
||
return;
|
||
}
|
||
|
||
/**
|
||
* 更新订单状态
|
||
* @param player
|
||
* @param data
|
||
*/
|
||
update_withdraw_state(roleid: any, data: any): boolean {
|
||
let info: any[] = this.mapCurrencyRoleOrder.get(Number(roleid));
|
||
if (info == null || info == undefined) {
|
||
return false;
|
||
}
|
||
let money = 0;
|
||
for (let i = 0; i < info.length; i++) {
|
||
let order: any = info[i];
|
||
if (order.serial == Number(data.serial)) {
|
||
info.splice(i, 1);
|
||
order.state = Number(data.state);
|
||
money = Number(order.money);
|
||
info.push(order);
|
||
break;
|
||
}
|
||
}
|
||
this.mapCurrencyRoleOrder.set(roleid, info);
|
||
let player: any = PlayerMgr.shared.getPlayerByRoleId(roleid);
|
||
if (player) {
|
||
// 通知前端
|
||
this.information(player);
|
||
// 发送公告
|
||
if (money > 0) {
|
||
let strRichText = `恭喜玩家:<color=#04eb5c >${player.name}</c ><color=#ffffff >成功提现 </c >【<color=#f09600 >${money}</color >元】,真实可喜可贺呀!</c >`;
|
||
PlayerMgr.shared.broadcast('s2c_screen_msg', {
|
||
strRichText: strRichText,
|
||
bInsertFront: 0
|
||
});
|
||
|
||
PlayerMgr.shared.broadcast('s2c_game_chat', {
|
||
msg: strRichText,
|
||
scale: 3
|
||
});
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 更新数据
|
||
*/
|
||
save() {
|
||
DB.updateConfiguration("currency_" + GameUtil.serverId, SKDataUtil.toJson({
|
||
quota: this.quota,
|
||
maxQuota: this.maxQuota,
|
||
state: this.state
|
||
}, "{}"));
|
||
}
|
||
|
||
/**
|
||
* 关闭在线奖励
|
||
*/
|
||
close() {
|
||
this.state = 0;
|
||
}
|
||
|
||
/**
|
||
* 随机获得点券奖励
|
||
*/
|
||
probability(): number {
|
||
let list: any = [];
|
||
for (let i = 0; i < this.award.length; i++) {
|
||
list.push(this.award[i]['prop'])
|
||
}
|
||
return Number(this.award[this.getResult(list)]['name']);
|
||
}
|
||
|
||
/**
|
||
* GM获得点券奖励
|
||
*/
|
||
gm_obtain_currency(player: any, task_name: string) {
|
||
// 本次获得金额
|
||
let money = this.probability();
|
||
// 获取余额
|
||
let balance = this.mapCurrencyRole.get(player.roleid);
|
||
if (balance != undefined && balance != null) {
|
||
balance += money;
|
||
} else {
|
||
balance = money;
|
||
}
|
||
// 重新存储
|
||
this.mapCurrencyRole.set(player.roleid, balance);
|
||
// 发送公告
|
||
let strRichText = `恭喜玩家在完成<color=#04EB5C >${task_name}</c >: <color=#ffffff >获得 </c >【<color=#F09600 >${money}</color >】提现金奖励,真实可喜可贺呀!</c >`;
|
||
PlayerMgr.shared.broadcast('s2c_screen_msg', {
|
||
strRichText: strRichText,
|
||
bInsertFront: 0
|
||
});
|
||
this.quota += money;
|
||
// 同步数据库
|
||
this.update_currency_role(player.roleid, balance);
|
||
this.save();
|
||
SKCxfUtil.getCxfCurrencyOperate({
|
||
roleId: player.roleid,
|
||
roleName: player.name,
|
||
operateType: Operate.PLAYER,
|
||
operateDepict: "GM获得点券奖励",
|
||
operateResSerial: player.roleid,
|
||
operateResName: `本次获得:${money}`,
|
||
operateContent: `本次获得:${money} 余额:${balance},总量:${this.quota} - ${this.maxQuota}`
|
||
});
|
||
return;
|
||
}
|
||
|
||
// 更新金额
|
||
update_currency_role(roleid: any, money: any) {
|
||
DB.updateCurrencyRole(roleid, money);
|
||
}
|
||
|
||
|
||
// 打金爆率
|
||
getRandom(probability: number): boolean {
|
||
probability = probability * 100 || 1;
|
||
let odds = Math.floor(Math.random() * 100);
|
||
if (probability === 1) {
|
||
return true
|
||
}
|
||
;
|
||
if (odds < probability) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
};
|
||
|
||
getResult(arr: any): any {
|
||
let extent: number = 0;
|
||
for (let i = 0; i < arr.length; i++) {
|
||
extent += arr[i] //获取总数
|
||
}
|
||
for (let i = 0; i < arr.length; i++) {
|
||
let random: any = parseInt((Math.random() * extent).toString()); //获取 0-总数 之间的一个随随机整数
|
||
if (random < arr[i]) {
|
||
return i //如果在当前的概率范围内,得到的就是当前概率
|
||
} else {
|
||
extent -= arr[i] //否则减去当前的概率范围,进入下一轮循环
|
||
}
|
||
}
|
||
}
|
||
} |