xy-server/game/core/MallMgr.ts
2025-04-23 09:34:08 +08:00

371 lines
13 KiB
TypeScript
Raw Permalink 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 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,"[]")
});
}
}