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

173 lines
6.6 KiB
TypeScript

import SKLogger from "../gear/SKLogger";
import PlayerMgr from "../object/PlayerMgr";
import GameUtil from "./GameUtil";
import ItemUtil from "./ItemUtil";
import SKDataUtil from "../gear/SKDataUtil";
import SKCxfUtil from "../gear/SKCxfUtil";
import {Operate} from "../role/EEnum";
export default class BoxMgr {
static shared = new BoxMgr();
boxs: any;
init() {
let conf = GameUtil.game_conf.boxs;
this.boxs = {};
for (let key in conf) {
let item = conf[key];
let box_id = item.box_id;
if (this.boxs[box_id] == null) {
this.boxs[box_id] = [];
}
this.boxs[box_id].push(item);
}
}
canUseItem(data: any): boolean {
let player = PlayerMgr.shared.getPlayerByRoleId(data.roleid);
if (player == null) {
return false;
}
let itemData = ItemUtil.getItemData(data.itemid);
if (itemData == null) {
return false;
}
console.log("itemData:",itemData)
let boxData = null;
let keyData = null;
if (itemData.type == 13) { // 如果是宝箱
console.log("宝箱!!!!!!!!!!!!!!!")
boxData = itemData;
console.log("itemData:",itemData.num)
keyData = ItemUtil.getItemData(itemData.num);
console.log("keyData:",keyData)
if (keyData) {
console.log("id:",keyData.id)
let keyCount = ItemUtil.getBagItemCount(player, keyData.id);
console.log("keyCount:",keyCount)
if (keyCount < 1) {
player.send('s2c_notice', {
strRichText: `您需要至少一把[color=#0fffff][${keyData.name}][/color]才能打开[color=#0fffff][${keyData.name}][/color]!`
});
return false;
}
}
} else if (itemData.type == 14) { // 如果是钥匙
boxData = ItemUtil.getItemData(itemData.num);
keyData = itemData;
if (boxData) {
let boxCount = ItemUtil.getBagItemCount(player, boxData.id);
if (boxCount < 1) {
player.send('s2c_notice', {
strRichText: `您需要至少一个[color=#0fffff][${boxData.name}][/color]才能使用[color=#0fffff][${keyData.name}][/color]!`
});
return false;
}
} else {
return false;
}
} else {
return false;
}
if (boxData == null) {
return false;
}
SKLogger.debug(`玩家[${player.name}(${player.roleid})]使用宝箱[${boxData.name}]`);
let select = this.randomSelect(boxData.id);
if (select.item_id == 0) {
if ((player.getBagItemAllKindNum() + select.item.length) >= player.bagKindNum) {
player.send('s2c_notice', {
strRichText: `背包空间不足,无法打开[color=#0fffff][${boxData.name}][/color]`
});
return false;
}
this.openGoods(player, boxData, keyData, select.item)
} else {
if (select.box_id != 50013 && select.box_id != 50033) {
if ((player.getBagItemAllKindNum() + select.count) >= player.bagKindNum) {
player.send('s2c_notice', {
strRichText: `背包空间不足,无法打开[color=#0fffff][${boxData.name}][/color]`
});
return false;
}
}
console.log("变身卡执行:",boxData, keyData, select)
this.openBox(player, boxData, keyData, select);
}
return true;
}
// 打开宝箱
openBox(player:any, boxData: any,keyData: any, select: any){
let rewardData = ItemUtil.getItemData(select.item_id);
console.log("rewardData:",rewardData)
SKLogger.debug(`玩家[${player.name}(${player.roleid})]打开宝箱[${boxData.name}]得到[${rewardData.name}]${select.count}`);
player.addItem(boxData.id, -1, false, "打开宝箱");
if (keyData) {
player.addItem(keyData.id, -1, false, `消耗钥匙`);
player.send('s2c_notice', {
strRichText: `你使用一把[color=#0fffff][${keyData.name}][/color]打开了[color=#0fffff][${boxData.name}][/color],里面有[color=#0fffff][${rewardData.name}][/color]${select.count}`
});
} else {
player.send('s2c_notice', {
strRichText: `你打开了[color=#0fffff][${boxData.name}][/color],里面有[color=#0fffff][${rewardData.name}][/color]${select.count}`
});
}
player.addItem(rewardData.id, select.count, true);
if(player) {
SKCxfUtil.getCxfRecordOperate({
roleId: player.roleid,
roleName: player.name,
operateType: Operate.ITEM,
operateDepict: "打开宝箱",
operateResSerial: rewardData.id,
operateResName: rewardData.name,
operateContent: SKDataUtil.toJson(player.bag_list, "{}")
})
}
}
// 打开礼包
openGoods(player:any, boxData: any,keyData: any, item: any) {
player.addItem(boxData.id, -1, false, "打开礼包");
for (let i = 0; i < item.length; i++) {
let data = item[i];
let rewardData = ItemUtil.getItemData(data.item_id);
player.addItem(rewardData.id, data.count, false);
}
player.send('s2c_notice', {
strRichText: `你打开了[color=#009F3C]${boxData.name}[/color],[color=#0fffff] ${SKDataUtil.beautySub(boxData.description,25)}`
});
if(player){
SKCxfUtil.getCxfRecordOperate({
roleId: player.roleid,
roleName: player.name,
operateType: Operate.ITEM,
operateDepict: "打开礼包",
operateResSerial: boxData.id,
operateResName: boxData.name,
operateContent: SKDataUtil.toJson(player.bag_list, "{}")
})
}
}
randomSelect(id: number): any {
let total = 0;
let list = this.boxs[id];
for (let item of list) {
total += item.rate;
}
let temp = GameUtil.random(0, total);
for (let i = 0; i < list.length; i++) {
let item = list[i];
temp -= item.rate;
if (temp <= 0)
return item;
}
return null;
}
}