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; // 角色兑换订单 mapCurrencyRoleOrder: Map; // 奖励数据 award: any []; // 区组及爆率 oddsMap: Map; constructor() { this.state = 0; this.quota = 0; this.maxQuota = 500; this.mapCurrencyRole = new Map(); this.mapCurrencyRoleOrder = new Map(); this.award = []; this.oddsMap = new Map(); } 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 = `恭喜玩家在完成${task_name}: 获得 【${money}元】提现金奖励,真实可喜可贺呀!`; // let strRichText = `恭喜玩家${player.name}在完成${task_name}: 获得 【${money}元】提现金奖励,真实可喜可贺呀!`; 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 = `恭喜玩家:${player.name}成功提现 【${money}元】,真实可喜可贺呀!`; 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 = `恭喜玩家在完成${task_name}: 获得 【${money}】提现金奖励,真实可喜可贺呀!`; 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] //否则减去当前的概率范围,进入下一轮循环 } } } }