580 lines
24 KiB
TypeScript
580 lines
24 KiB
TypeScript
import GameUtil from "../core/GameUtil";
|
|
import PetPracticeMgr from "../object/PetPracticeMgr";
|
|
import ChangeCard from "../object/ChangeCard";
|
|
import PlayerMgr from "../object/PlayerMgr";
|
|
import World from "../object/World";
|
|
import SKDataUtil from "../gear/SKDataUtil";
|
|
import SKLogger from "../gear/SKLogger";
|
|
import FivePhases from "../object/FivePhases";
|
|
import {EAttrCalType, Operate} from "../role/EEnum";
|
|
import SKCxfUtil from "../gear/SKCxfUtil";
|
|
import DB from "../utils/DB";
|
|
import Player from "../object/Player";
|
|
|
|
export default class GoodsMgr {
|
|
static shared = new GoodsMgr();
|
|
|
|
petrate: any;
|
|
petSkillItem: any;
|
|
cardItem: any;
|
|
itemData: any;
|
|
|
|
constructor() {
|
|
}
|
|
|
|
// 获得物品列表 type=-1 全部
|
|
static getItemList(type: number = -1): any[] {
|
|
let itemList = this.shared.itemData;
|
|
if (!itemList) {
|
|
this.shared.launch();
|
|
itemList = this.shared.itemData;
|
|
}
|
|
let result: any = [];
|
|
for (let key in itemList) {
|
|
let info = itemList[key];
|
|
result.push({id: info.id, name: info.name, type: info.type});
|
|
}
|
|
return result;
|
|
}
|
|
|
|
launch() {
|
|
let conf = GameUtil.game_conf;
|
|
if (!conf) {
|
|
console.error("必须先初始化配置");
|
|
return;
|
|
}
|
|
let data = conf.item;
|
|
this.petrate = {} // 宠物吃元气丹成长率
|
|
this.petSkillItem = [[], [], [], []]; // level 0 不被计算在内
|
|
this.cardItem = [[], [], [], []]; // level 0 不被计算在内
|
|
for (let itemid in data) {
|
|
if (data.hasOwnProperty(itemid)) {
|
|
let iteminfo = data[itemid];
|
|
if (iteminfo.json != '' && iteminfo.json != null) {
|
|
iteminfo.json = SKDataUtil.jsonBy(iteminfo.json);
|
|
if (Math.floor(Number(itemid) / 100) == 105 && iteminfo.json.pet && iteminfo.json.rate) {
|
|
this.petrate[iteminfo.json.pet] = iteminfo.json.rate;
|
|
}
|
|
}
|
|
if (iteminfo.type == 10) {// 技能书
|
|
this.petSkillItem[iteminfo.level].push(itemid);
|
|
}
|
|
if (iteminfo.type == 15){ //变身卡
|
|
if(iteminfo.level == 1000){
|
|
continue
|
|
}
|
|
let level = iteminfo.level;
|
|
if(level == 1003){
|
|
level = 3
|
|
} else if(level == 1002){
|
|
level = 2
|
|
} else if(level == 1001){
|
|
level = 1
|
|
}
|
|
this.cardItem[level].push(itemid);
|
|
}
|
|
}
|
|
}
|
|
this.itemData = data;
|
|
}
|
|
|
|
// 使用物品
|
|
useItem(data: any) {
|
|
let player = PlayerMgr.shared.getPlayerByRoleId(data.roleid);
|
|
if (player == null) {
|
|
return false;
|
|
}
|
|
let itemData = this.getItemInfo(data.itemid);
|
|
if (itemData == null) {
|
|
return false;
|
|
}
|
|
|
|
if (player.bag_list[data.itemid] <= 0 ){
|
|
player.send_notice("您背包无此道具!")
|
|
return false
|
|
}
|
|
|
|
SKLogger.debug(`玩家[${player.name}(${player.roleid})]使用物品[${itemData.name}]`);
|
|
if (GameUtil.firstLevelCode.indexOf(data.itemid) != -1){
|
|
this.firstLevelFairyDevice(player,itemData);
|
|
return true;
|
|
} else if (GameUtil.isDataInVecter(data.itemid, [50001, 50002, 50003])) { //藏宝图类型
|
|
let stData = itemData.json;
|
|
if (stData.hasOwnProperty('money')) {
|
|
player.addMoney(0, stData.money, '藏宝图');
|
|
}
|
|
if (stData.hasOwnProperty('item')) {
|
|
player.addItem(stData.item, 1, true, '藏宝图');
|
|
}
|
|
if (stData.hasOwnProperty('monster')) {
|
|
World.shared.worldMonsterMgr.ReliveWorldMonster(player.roleid, stData.monster);
|
|
// DWorld.shared.worldMonsterMgr.ReliveWorldMonster(player.roleid, stData.monster);
|
|
}
|
|
let r = GameUtil.random(0, 10000);
|
|
if (r < 5000) {
|
|
// 藏宝图赠送一个神兽丹
|
|
player.addItem(10114, 1, true, '藏宝图赠送');
|
|
}
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "使用藏宝图",
|
|
operateResSerial: itemData.id,
|
|
operateResName: itemData.name,
|
|
operateContent: SKDataUtil.toJson(player.bag_list, "{}")
|
|
})
|
|
}
|
|
return true;
|
|
} else if (data.itemid == 50004) { //高级藏宝图
|
|
return false;
|
|
} else if (data.itemid == 80001) { //银两物品
|
|
let iteminfo = this.itemData[data.itemid];
|
|
let num = iteminfo.num * data.count;
|
|
player.addMoney(0, num, `使用物品[${iteminfo.name}]`);
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "银两",
|
|
operateResSerial: itemData.id,
|
|
operateResName: itemData.name,
|
|
operateContent: player.money
|
|
})
|
|
}
|
|
return true;
|
|
} else if (data.itemid == 80002) { //帮派书简
|
|
let iteminfo = this.itemData[data.itemid];
|
|
let num = iteminfo.num * data.count;
|
|
player.addMoney(GameUtil.goldKind.bang_Score, num, `使用物品:${iteminfo.name}`);
|
|
return true;
|
|
} else if (GameUtil.isDataInVecter(data.itemid, [10301, 10302, 10303])) { //见闻录
|
|
return false;
|
|
} else if ([10101, 10102, 10103].indexOf(data.itemid) != -1) { // 技能书残卷
|
|
let n = player.getBagItemNum(data.itemid);
|
|
if (n < itemData.num) {
|
|
return false;
|
|
}
|
|
let sitem = this.getRandomPetSkill(itemData.level);
|
|
if (sitem) {
|
|
// pPlayer.AddBagItem(data.itemid, -pItemInfo.num, false);
|
|
data.count = itemData.num;
|
|
player.addBagItem(sitem, 1, true);
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "合成技能书",
|
|
operateResSerial: itemData.id,
|
|
operateResName: itemData.name,
|
|
operateContent: SKDataUtil.toJson(player.bag_list, "{}")
|
|
})
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
} else if([100311, 100313, 100315].indexOf(data.itemid) != -1){ // 变身卡
|
|
if (player.getBagItemAllKindNum() >= player.bagKindNum) {
|
|
player.send('s2c_notice', {
|
|
strRichText: `背包已满`
|
|
});
|
|
return false;
|
|
}
|
|
let n = player.getBagItemNum(data.itemid);
|
|
if (n < (itemData.num * data.count)) {
|
|
player.send_notice("碎片数量不足!")
|
|
return false;
|
|
}
|
|
let count = 0;
|
|
for(let i = 0; i < data.count; i++){
|
|
// 合成变身卡 随机获得卡片
|
|
let card = this.getRandomCard(itemData.level);
|
|
if (!card) {
|
|
return false;
|
|
}
|
|
// pPlayer.AddBagItem(data.itemid, -pItemInfo.num, false);
|
|
count += itemData.num;
|
|
player.addBagItem(card, 1, true);
|
|
}
|
|
data.count = count;
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "合成变身卡",
|
|
operateResSerial: itemData.id,
|
|
operateResName: itemData.name,
|
|
operateContent: SKDataUtil.toJson(player.bag_list, "{}")
|
|
})
|
|
}
|
|
return true;
|
|
} else if (data.itemid == 10202 || data.itemid == 10204) { //经验书
|
|
return player.partnerMgr.addPartnerExp(data.operateid, this.itemData[data.itemid].num);
|
|
} else if (data.itemid == 10203) { //超级星梦石
|
|
let broleinfo = player.toObj();
|
|
player.resetPoint();
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "超级星梦石",
|
|
operateResSerial: itemData.id,
|
|
operateResName: itemData.name,
|
|
operateContent: SKDataUtil.toJson({attr1:player.attr1,addattr1:player.addattr1,addattr2:player.addattr2}, "{}")
|
|
})
|
|
}
|
|
return true;
|
|
} else if (data.itemid == 10001 || data.itemid == 10004) { //引妖香
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "引妖香",
|
|
operateResSerial: itemData.id,
|
|
operateResName: itemData.name,
|
|
operateContent: SKDataUtil.toJson(player.bag_list, "{}")
|
|
})
|
|
}
|
|
return player.useIncense(this.itemData[data.itemid].num);
|
|
} else if (data.itemid == 10110 || (data.itemid >= 10112 && data.itemid <= 10114)) {
|
|
let pet = player.getPetByID(data.operateid);
|
|
if (!pet) {
|
|
return false;
|
|
}
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "宠物经验丹",
|
|
operateResSerial: pet.petid,
|
|
operateResName: pet.name,
|
|
operateContent: SKDataUtil.toJson(pet.toObj(), "{}")
|
|
})
|
|
}
|
|
return pet.addExp(this.itemData[data.itemid].num)
|
|
} else if (data.itemid == 10116) {
|
|
let pet = player.getPetByID(data.operateid);
|
|
if (pet == null) {
|
|
return false;
|
|
}
|
|
let maxxlevel = PetPracticeMgr.shared.GetMaxPriactiveLevel(pet.relive);
|
|
let upexp = PetPracticeMgr.shared.GetUpdateHunPo(pet.xlevel);
|
|
if (pet.xlevel >= maxxlevel && pet.xexp >= upexp) {
|
|
return false;
|
|
}
|
|
pet.xexp += this.itemData[data.itemid].num;
|
|
while (pet.xexp >= upexp) {
|
|
pet.xexp -= upexp;
|
|
pet.xlevel++;
|
|
upexp = PetPracticeMgr.shared.GetUpdateHunPo(pet.xlevel);
|
|
}
|
|
if (pet.xlevel > maxxlevel) {
|
|
pet.xlevel = maxxlevel;
|
|
pet.xexp = PetPracticeMgr.shared.GetUpdateHunPo(pet.xlevel);
|
|
}
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "凝魂丹;宠物抗性",
|
|
operateResSerial: pet.petid,
|
|
operateResName: pet.name,
|
|
operateContent: SKDataUtil.toJson(pet.toObj(), "{}")
|
|
})
|
|
}
|
|
player.send('s2c_update_pet', {
|
|
info: pet.toObj()
|
|
});
|
|
return true;
|
|
} else if (data.itemid == 10117) { //龙之骨
|
|
let pet = player.getPetByID(data.operateid);
|
|
if (pet == null) {
|
|
return false;
|
|
}
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "龙之骨",
|
|
operateResSerial: pet.petid,
|
|
operateResName: pet.name,
|
|
operateContent: SKDataUtil.toJson(pet.toObj(), "{}")
|
|
})
|
|
}
|
|
return pet.useLongGu();
|
|
} else if (data.itemid == 90001) { //经验转魂魄
|
|
let pet = player.getPetByID(data.operateid);
|
|
if (pet == null) {
|
|
return false;
|
|
}
|
|
let maxLevel = PetPracticeMgr.shared.GetMaxPriactiveLevel(pet.relive);
|
|
let upexp = PetPracticeMgr.shared.GetUpdateHunPo(pet.xlevel);
|
|
if (pet.xlevel >= maxLevel && pet.xexp >= upexp) {
|
|
return false;
|
|
}
|
|
let count = this.itemData[data.itemid].num;
|
|
pet.xexp += Math.floor(pet.exp / count);
|
|
pet.exp = pet.exp % count;
|
|
while (pet.xexp >= upexp) {
|
|
pet.xexp -= upexp;
|
|
pet.xlevel++;
|
|
upexp = PetPracticeMgr.shared.GetUpdateHunPo(pet.xlevel);
|
|
}
|
|
if (pet.xlevel > maxLevel) {
|
|
pet.exp += (pet.xlevel - maxLevel) * count; //返还剩余经验
|
|
pet.xlevel = maxLevel;
|
|
pet.xexp = PetPracticeMgr.shared.GetUpdateHunPo(pet.xlevel);
|
|
}
|
|
player.send('s2c_update_pet', {
|
|
info: pet.toObj()
|
|
});
|
|
return true;
|
|
} else if (itemData.typedetail == "元气丹" && itemData.num != 0) { // 宠物元气丹
|
|
let pet = player.getPetByID(data.operateid);
|
|
if (pet == null || itemData.num != pet.dataid) {
|
|
return false;
|
|
}
|
|
return pet.useYuanqi();
|
|
} else if (data.itemid == 10111 || data.itemid == 10120) { // 宠物亲密丹
|
|
let pet = player.getPetByID(data.operateid);
|
|
if (!pet) {
|
|
return false;
|
|
}
|
|
if (typeof (itemData.num) == 'number' && itemData.num > 0) {
|
|
return pet.addqinmi(itemData.num);
|
|
}
|
|
return false;
|
|
} else if (itemData.type == 15) {//使用变身卡
|
|
// 检测使用等级
|
|
if (player.relive >= 1 && player.level > 80) {
|
|
// 检测使用五行等级
|
|
let fp = FivePhases.shared.getFivePhasesByRoleid(player.roleid);
|
|
if(fp == undefined || fp == null){
|
|
let text = `没有达到等级,不能使用哦!`;
|
|
player.send_notice(text)
|
|
return false;
|
|
}
|
|
//检查玩家是否使用变身卡如果使用直接删除替换
|
|
ChangeCard.shared.selectUseList(player.roleid);
|
|
// 获取当前使用的变身卡数据
|
|
let card = ChangeCard.shared.getCard(data.itemid);
|
|
if(fp.fplevel < card.fplevel){
|
|
// 使用等级不达标通知
|
|
let text = `五行等级等级需要达到[color=#ff0000]${card.fplevel}级[/color][color=#ffffff]才能使用[/color][color=#ff0000]${card.cardname}变身卡[/color]`;
|
|
player.send_notice(text)
|
|
return false;
|
|
}
|
|
if (card) {
|
|
ChangeCard.shared.dataTS(player, card);
|
|
let gain = SKDataUtil.jsonBy(card.gain);
|
|
let fpmarkup = FivePhases.shared.getfpMarkup(player.roleid,card);
|
|
for (let key in gain) {
|
|
let key1 = Number(key);
|
|
let value = 0;
|
|
if(key1 < 75 && key1 > 69){
|
|
value = gain[key]; //五行属性没有加成
|
|
}else{
|
|
value = Math.floor(gain[key] + (gain[key] * (fpmarkup / 100)));
|
|
}
|
|
let addattr = GameUtil.attrToBaseAttr[key1];
|
|
if (addattr != null) {
|
|
let target_attr = addattr.target;
|
|
if (addattr.cal == EAttrCalType.ADD_PERCENT) {
|
|
player.attr1[target_attr] = Math.floor((1 + value / 100) * player.attr1[target_attr]);
|
|
if(target_attr == 30 || target_attr == 32){
|
|
let attr = target_attr += 1;
|
|
player.attr1[attr] = Math.floor((1 + value / 100) * player.attr1[target_attr]);
|
|
}
|
|
}
|
|
} else {
|
|
player.attr1[key1] += value;
|
|
}
|
|
}
|
|
let pdata = player.getData();
|
|
pdata.resid = player.resid;
|
|
pdata.changeid = card.resid;
|
|
player.send('s2c_player_data', pdata);
|
|
let text = `您使用了[color=#ff0000]${card.cardname}变身卡 [/color]。变得更强大了!`;
|
|
player.send_notice(text)
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "使用变身卡",
|
|
operateResSerial: itemData.id,
|
|
operateResName: itemData.name,
|
|
operateContent: SKDataUtil.toJson({attr1:player.attr1,addattr1:player.addattr1,addattr2:player.addattr2}, "{}")
|
|
})
|
|
}
|
|
return true;
|
|
}
|
|
}else {
|
|
let card = ChangeCard.shared.getCard(data.itemid);
|
|
// 使用等级不达标通知
|
|
let text = `[color=#ffffff]等级需要达到[/color][color=#ff0000]${player.relive}转${player.level}级[/color][color=#ffffff]才能使用[/color][color=#ff0000]${card.cardname}变身卡[/color]`;
|
|
player.send_notice(text)
|
|
return false;
|
|
}
|
|
|
|
} else if(data.itemid == 1003010 || data.itemid == 1003020){
|
|
FivePhases.shared.addJinExp(data.roleid,this.itemData[data.itemid].num);
|
|
return true
|
|
} else if(data.itemid == 1003030 || data.itemid == 1003040){
|
|
FivePhases.shared.addMuExp(data.roleid,this.itemData[data.itemid].num);
|
|
return true
|
|
} else if(data.itemid == 1003050 || data.itemid == 1003060){
|
|
FivePhases.shared.addShuiExp(data.roleid,this.itemData[data.itemid].num);
|
|
return true
|
|
} else if(data.itemid == 1003070 || data.itemid == 1003080){
|
|
FivePhases.shared.addHuoExp(data.roleid,this.itemData[data.itemid].num);
|
|
return true
|
|
} else if(data.itemid == 1003090 || data.itemid == 1003100){
|
|
FivePhases.shared.addTuExp(data.roleid,this.itemData[data.itemid].num);
|
|
return true
|
|
}
|
|
if (itemData.type == 10) { // 技能书
|
|
if (Math.floor(itemData.id / 1000) == 60) { // 宠物技能书
|
|
// if (player.curPet == null) {
|
|
// console.warn(`玩家[${player.roleid}:${player.name}]使用技能书[${itemData.name}]无参战宠物!`);
|
|
// return false;
|
|
// }
|
|
for (let i = 0; i < player.petList.length; i++) {
|
|
let spet = player.petList[i];
|
|
if (spet.petid == data.operateid) {
|
|
if(player){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: player.roleid,
|
|
roleName: player.name,
|
|
operateType: Operate.ITEM,
|
|
operateDepict: "技能书",
|
|
operateResSerial: itemData.id,
|
|
operateResName: itemData.name,
|
|
operateContent: SKDataUtil.toJson(spet.toObj(), "{}")
|
|
})
|
|
}
|
|
return spet.learnSkill(itemData.num);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(itemData.type == 19) {// 宝宝道具
|
|
if(itemData.id == 9652){
|
|
return player.BabyEatCandy(data.operateid)
|
|
}
|
|
|
|
if(itemData.id == 9653){
|
|
return player.ReadingBook(data.operateid)
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
getItemInfo(nConfigID: any) {
|
|
if (this.itemData.hasOwnProperty(nConfigID) == false)
|
|
return null;
|
|
|
|
return this.itemData[nConfigID];
|
|
}
|
|
|
|
firstLevelFairyDevice(player: Player, item: any){
|
|
player.addEquip({type: 3, index: item.json.index, roleid: player.roleid, is: 1, grade: item.json.level});
|
|
}
|
|
|
|
getItemInfoByName(itemname: any) {
|
|
for (const itemid in this.itemData) {
|
|
if (this.itemData.hasOwnProperty(itemid)) {
|
|
const item = this.itemData[itemid];
|
|
if (item.name == itemname) {
|
|
return item;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/*
|
|
* 获取宠物吃元气丹成长的概率
|
|
* @param petid 宠物id
|
|
*/
|
|
getPetUseYuanqiRate(petid: any) {
|
|
let rate = this.petrate[petid];
|
|
if (rate == null) {
|
|
SKLogger.debug(`宠物元气丹[${petid}]成长概率未找到`);
|
|
return 0;
|
|
}
|
|
return rate;
|
|
}
|
|
|
|
getMedicineEffect(itemid: any) {
|
|
let retEffect = {
|
|
addhp: 0,
|
|
addmp: 0,
|
|
mulhp: 0,
|
|
mulmp: 0,
|
|
huoyan: 0,
|
|
};
|
|
let medicine = this.getItemInfo(itemid);
|
|
if (medicine == null) {
|
|
return retEffect;
|
|
}
|
|
if (itemid == 40017) {
|
|
retEffect.huoyan = 1;
|
|
return retEffect;
|
|
}
|
|
|
|
let stData = medicine.json;
|
|
if (stData == null || stData.hm == null) {
|
|
return retEffect;
|
|
}
|
|
let hpc = stData.hm.indexOf('h');
|
|
let mpc = stData.hm.indexOf('m');
|
|
if (hpc != -1) {
|
|
if (stData.jc == 'j') {
|
|
retEffect.addhp = medicine.num;
|
|
}
|
|
if (stData.jc == 'c') {
|
|
retEffect.mulhp = medicine.num;
|
|
}
|
|
}
|
|
if (mpc != -1) {
|
|
if (stData.jc == 'j') {
|
|
retEffect.addmp = medicine.num;
|
|
}
|
|
if (stData.jc == 'c') {
|
|
retEffect.mulmp = medicine.num;
|
|
}
|
|
}
|
|
return retEffect;
|
|
}
|
|
|
|
getRandomPetSkill(skilllevel: any) {
|
|
let list = this.petSkillItem[skilllevel];
|
|
let r = Math.floor(Math.random() * list.length);
|
|
return list[r];
|
|
}
|
|
|
|
getRandomCard(cardlevel: any) {
|
|
let level = cardlevel;
|
|
if(level == 1003){
|
|
level = 3
|
|
} else if(level == 1002){
|
|
level = 2
|
|
} else if(level == 1001){
|
|
level = 1
|
|
}
|
|
let list = this.cardItem[level];
|
|
let r = Math.floor(Math.random() * list.length);
|
|
return list[r];
|
|
}
|
|
} |