371 lines
13 KiB
TypeScript
371 lines
13 KiB
TypeScript
|
import SKDataUtil from "../gear/SKDataUtil";
|
|||
|
import GameUtil from "./GameUtil";
|
|||
|
import ItemUtil from "./ItemUtil";
|
|||
|
import Player from "../object/Player";
|
|||
|
import DB from "../utils/DB";
|
|||
|
import {MsgCode, Operate} from "../role/EEnum";
|
|||
|
import SKCxfUtil from "../gear/SKCxfUtil";
|
|||
|
|
|||
|
export default class MallMgr {
|
|||
|
static shared = new MallMgr();
|
|||
|
// 新鲜玩意
|
|||
|
freshList: any;
|
|||
|
// 强化材料
|
|||
|
mallList: any;
|
|||
|
// 每日限购
|
|||
|
dayList: any;
|
|||
|
// 每日推荐
|
|||
|
recList: any;
|
|||
|
// 积分兑换
|
|||
|
integralList: any;
|
|||
|
//绑定仙玉
|
|||
|
bindList: any
|
|||
|
mapNpcShop: any;
|
|||
|
constructor() {
|
|||
|
this.mapNpcShop = {};
|
|||
|
}
|
|||
|
|
|||
|
init() {
|
|||
|
DB.selectShopData((code: any, info: any) => {
|
|||
|
if (MsgCode.SUCCESS == code){
|
|||
|
// 新鲜玩意
|
|||
|
let freshList: any = {}
|
|||
|
for (const propFresh of info.propFresh) {
|
|||
|
freshList[propFresh.id] = propFresh;
|
|||
|
}
|
|||
|
this.freshList = freshList;
|
|||
|
// 强化材料
|
|||
|
let mallList: any = {}
|
|||
|
for (const propMall of info.propMall) {
|
|||
|
mallList[propMall.id] = propMall;
|
|||
|
}
|
|||
|
this.mallList = mallList;
|
|||
|
// 每日限购
|
|||
|
let dayList: any = {}
|
|||
|
for (const propDay of info.propDayLimit) {
|
|||
|
dayList[propDay.id] = propDay;
|
|||
|
}
|
|||
|
this.dayList = dayList;
|
|||
|
// 每日推荐
|
|||
|
let recList: any = {}
|
|||
|
for (const propRec of info.propRecommend) {
|
|||
|
recList[propRec.id] = propRec;
|
|||
|
}
|
|||
|
this.recList = recList;
|
|||
|
// 积分兑换
|
|||
|
let integralList: any = {}
|
|||
|
for (const propInt of info.propIntegral) {
|
|||
|
integralList[propInt.id] = propInt;
|
|||
|
}
|
|||
|
this.integralList = integralList;
|
|||
|
// 绑定仙玉
|
|||
|
let bindList: any = {}
|
|||
|
for (const propInt of info.propBindJade) {
|
|||
|
bindList[propInt.id] = propInt;
|
|||
|
}
|
|||
|
this.bindList = bindList;
|
|||
|
}
|
|||
|
});
|
|||
|
// NPC商店
|
|||
|
let npcdata = GameUtil.require_ex('../../conf/prop_data/prop_npc_shop');
|
|||
|
for (let _ in npcdata) {
|
|||
|
const npcmall = npcdata[_];
|
|||
|
if (this.mapNpcShop[npcmall.npcid] == null) {
|
|||
|
this.mapNpcShop[npcmall.npcid] = { goods: [] }
|
|||
|
}
|
|||
|
let mtype = npcmall.type == '' ? null : npcmall.type;
|
|||
|
this.mapNpcShop[npcmall.npcid].goods.push({
|
|||
|
itemid: npcmall.itemid,
|
|||
|
moneykind: npcmall.kind,
|
|||
|
price: npcmall.price,
|
|||
|
type: mtype,
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 同步新鲜玩意
|
|||
|
syncFresh(){
|
|||
|
DB.selectShopData((code: any, info: any) => {
|
|||
|
if (MsgCode.SUCCESS == code) {
|
|||
|
// 新鲜玩意
|
|||
|
this.freshList ={};
|
|||
|
let freshList: any = {};
|
|||
|
for (const propFresh of info.propFresh) {
|
|||
|
freshList[propFresh.id] = propFresh;
|
|||
|
}
|
|||
|
this.freshList = freshList;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 同步强化材料
|
|||
|
syncIntensify(){
|
|||
|
DB.selectShopData((code: any, info: any) => {
|
|||
|
if (MsgCode.SUCCESS == code) {
|
|||
|
// 强化材料
|
|||
|
this.mallList = {};
|
|||
|
let mallList: any = {};
|
|||
|
for (const propMall of info.propMall) {
|
|||
|
mallList[propMall.id] = propMall;
|
|||
|
}
|
|||
|
this.mallList = mallList;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 同步限购商店
|
|||
|
syncQuota(){
|
|||
|
DB.selectShopData((code: any, info: any) => {
|
|||
|
if (MsgCode.SUCCESS == code) {
|
|||
|
// 每日限购
|
|||
|
this.dayList = {};
|
|||
|
let dayList: any = {}
|
|||
|
for (const propDay of info.propDayLimit) {
|
|||
|
dayList[propDay.id] = propDay;
|
|||
|
}
|
|||
|
this.dayList = dayList;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 同步每日推荐
|
|||
|
syncRecommend(){
|
|||
|
DB.selectShopData((code: any, info: any) => {
|
|||
|
if (MsgCode.SUCCESS == code) {
|
|||
|
// 每日限购
|
|||
|
this.recList = {};
|
|||
|
let recList: any = {}
|
|||
|
for (const propRec of info.propRecommend) {
|
|||
|
recList[propRec.id] = propRec;
|
|||
|
}
|
|||
|
this.recList = recList;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 同步积分商店
|
|||
|
syncIntegral(){
|
|||
|
DB.selectShopData((code: any, info: any) => {
|
|||
|
if (MsgCode.SUCCESS == code) {
|
|||
|
// 每日限购
|
|||
|
this.integralList = {};
|
|||
|
let integralList: any = {}
|
|||
|
for (const propInte of info.propIntegral) {
|
|||
|
integralList[propInte.id] = propInte;
|
|||
|
}
|
|||
|
this.integralList = integralList;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 同步绑定商店
|
|||
|
syncBindJade(){
|
|||
|
DB.selectShopData((code: any, info: any) => {
|
|||
|
if (MsgCode.SUCCESS == code) {
|
|||
|
// 每日限购
|
|||
|
this.bindList = {};
|
|||
|
let bindList: any = {}
|
|||
|
for (const propInte of info.propBindJade) {
|
|||
|
bindList[propInte.id] = propInte;
|
|||
|
}
|
|||
|
this.bindList = bindList;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
checkNpcData(npcid: any) {
|
|||
|
if (this.mapNpcShop.hasOwnProperty(npcid) == false)
|
|||
|
return false;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
getNpcShopData(npcId: any) {
|
|||
|
return this.mapNpcShop[npcId];
|
|||
|
}
|
|||
|
|
|||
|
getMallData(type: number, mallid: any): any {
|
|||
|
if (type == 0) {
|
|||
|
return this.freshList[mallid];
|
|||
|
} else if (type == 1) {
|
|||
|
return this.mallList[mallid];
|
|||
|
} else if (type == 2) {
|
|||
|
return this.dayList[mallid];
|
|||
|
} else if (type == 3) {
|
|||
|
return this.recList[mallid];
|
|||
|
} else if (type == 4){
|
|||
|
return this.integralList[mallid];
|
|||
|
} else if (type == 5){
|
|||
|
return this.bindList[mallid];
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
buyItem(player: Player, type: number, mallId: any, num: any) {
|
|||
|
if (player.getBagItemAllKindNum() >= player.bagKindNum) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '背包已满,无法购买'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
let mallData = this.getMallData(type, mallId);
|
|||
|
if (!mallData) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: `商品[${mallId}]不存在!`
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
let itemData = ItemUtil.getItemData(mallData.itemid);
|
|||
|
if (!itemData) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: `商品[${mallId}]定义不存在!`
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
if (num < 1) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: `商品[${itemData.name}]购买数量必须大于0个!`
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
let current = player.getDayCount(mallId);
|
|||
|
if (mallData.time > 0) {
|
|||
|
num = Math.min(num, mallData.time - current);
|
|||
|
if (num < 1) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: `[${itemData.name}]已购买${mallData.time}个达到今日可购上限!`
|
|||
|
})
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
let discount = 0; //打折后的价格
|
|||
|
if(mallData.discount > 0){
|
|||
|
discount = Math.floor(mallData.price * (mallData.discount / 100));
|
|||
|
}else{
|
|||
|
discount = mallData.price;
|
|||
|
}
|
|||
|
let cost = discount * num;
|
|||
|
if(type == 4){
|
|||
|
if(mallData.item_kind == 4){ //功绩兑换
|
|||
|
if(player.shuilu.gongji < cost){
|
|||
|
player.send_notice("您的积分不够,不能兑换!");
|
|||
|
return;
|
|||
|
}
|
|||
|
player.shuilu.gongji -= cost
|
|||
|
player.addItem(mallData.itemid, num, true, '积分购物');
|
|||
|
player.send('s2c_player_data', player.getData());
|
|||
|
}else if(mallData.item_kind == 6){ //竞技场积分兑换
|
|||
|
if(player.arena.jpoint < cost){
|
|||
|
player.send_notice("您的积分不够,不能兑换!");
|
|||
|
return;
|
|||
|
}
|
|||
|
player.arena.jpoint -= cost;
|
|||
|
player.addItem(mallData.itemid, num, true, '积分购物');
|
|||
|
player.send('s2c_player_data', player.getData());
|
|||
|
}else if(mallData.item_kind == 5){ //地宫积分兑换
|
|||
|
if(player.discore < cost){
|
|||
|
player.send_notice("您的积分不够,不能兑换!");
|
|||
|
return;
|
|||
|
}
|
|||
|
player.addMoney(GameUtil.goldKind.di_Score, -cost, "积分购物")
|
|||
|
player.addItem(mallData.itemid, num, true, '积分购物');
|
|||
|
player.send('s2c_player_data', player.getData());
|
|||
|
}else if(mallData.item_kind == 2){ //除魔积分兑换
|
|||
|
if(player.xiuscore < cost){
|
|||
|
player.send_notice("您的积分不够,不能兑换!");
|
|||
|
return;
|
|||
|
}
|
|||
|
player.addMoney(GameUtil.goldKind.xiu_Score, -cost, "积分购物")
|
|||
|
player.addItem(mallData.itemid, num, true, '积分购物');
|
|||
|
player.send('s2c_player_data', player.getData());
|
|||
|
}else if(mallData.item_kind == 3){ //郭氏积分兑换
|
|||
|
if(player.guoscore < cost){
|
|||
|
player.send_notice("您的积分不够,不能兑换!");
|
|||
|
return;
|
|||
|
}
|
|||
|
player.addMoney(GameUtil.goldKind.guo_Score, -cost, "积分购物")
|
|||
|
player.addItem(mallData.itemid, num, true, '积分购物');
|
|||
|
player.send('s2c_player_data', player.getData());
|
|||
|
}else{
|
|||
|
player.send_notice("这个商店还没开通哦!")
|
|||
|
}
|
|||
|
}else{
|
|||
|
let info = '';
|
|||
|
if(type == 5){
|
|||
|
info = player.CostFee(2, cost, `从多宝购买${num}个${itemData.name}`);
|
|||
|
}else{
|
|||
|
info = player.CostFee(1, cost, `从多宝购买${num}个${itemData.name}`);
|
|||
|
}
|
|||
|
if (info != '') {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: info
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
player.addDayCount(mallId, num);
|
|||
|
player.addItem(mallData.itemid, num, true, '多宝购物');
|
|||
|
if(player){
|
|||
|
SKCxfUtil.getCxfRecordOperate({
|
|||
|
roleId: player.roleid,
|
|||
|
roleName: player.name,
|
|||
|
operateType: Operate.PLAYER,
|
|||
|
operateDepict: "购买物品",
|
|||
|
operateResSerial: mallData.itemid,
|
|||
|
operateResName: itemData.name,
|
|||
|
operateContent: SKDataUtil.toJson(player.jade, "{}")
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
this.sendList(player);
|
|||
|
}
|
|||
|
// 发送商店列表
|
|||
|
sendList(player: Player) {
|
|||
|
if (player == null) {
|
|||
|
return;
|
|||
|
}
|
|||
|
let freshList = this.freshList;
|
|||
|
let mallList = this.mallList;
|
|||
|
let dayList = this.dayList;
|
|||
|
let recList = this.recList;
|
|||
|
let bindList = this.bindList;
|
|||
|
for (let key in dayList) {
|
|||
|
let item = dayList[key];
|
|||
|
item.count = player.getDayCount(item.id);
|
|||
|
if(item.discount > 0){
|
|||
|
item.discountPrice = Math.floor(item.price * (item.discount / 100));
|
|||
|
}else{
|
|||
|
item.discountPrice = item.price;
|
|||
|
}
|
|||
|
}
|
|||
|
for (let key in recList) {
|
|||
|
let item = recList[key];
|
|||
|
item.count = player.getDayCount(item.id);
|
|||
|
if(item.discount > 0){
|
|||
|
item.discountPrice = Math.floor(item.price * (item.discount / 100));
|
|||
|
}else{
|
|||
|
item.discountPrice = item.price;
|
|||
|
}
|
|||
|
}
|
|||
|
for (let key in bindList) {
|
|||
|
let item = bindList[key];
|
|||
|
item.count = player.getDayCount(item.id);
|
|||
|
if(item.discount > 0){
|
|||
|
item.discountPrice = Math.floor(item.price * (item.discount / 100));
|
|||
|
}else{
|
|||
|
item.discountPrice = item.price;
|
|||
|
}
|
|||
|
}
|
|||
|
player.send('s2c_mallitems', {
|
|||
|
info: SKDataUtil.toJson([freshList, mallList, dayList, recList, bindList],"[]")
|
|||
|
});
|
|||
|
}
|
|||
|
// 发送积分商店列表
|
|||
|
sendIntegralList(player: Player) {
|
|||
|
if (player == null) {
|
|||
|
return;
|
|||
|
}
|
|||
|
let integralList = this.integralList;
|
|||
|
player.send('s2c_integralmall', {
|
|||
|
info: SKDataUtil.toJson(integralList,"[]")
|
|||
|
});
|
|||
|
}
|
|||
|
}
|