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

223 lines
5.9 KiB
TypeScript

import GameUtil from "./GameUtil";
import DB from "../utils/DB";
import Pet from "../object/Pet";
import SKDataUtil from "../gear/SKDataUtil"
import Player from "../object/Player";
import ItemUtil from "./ItemUtil";
import SKLogger from "../gear/SKLogger";
import { MsgCode,Aptitude } from "../role/EEnum";
export default class PetMgr {
static shared = new PetMgr();
pet_data_list: any;
pet_color_list: any;
dbTimer: any;
constructor() {
this.pet_data_list = {};
this.pet_color_list = {};
this.dbTimer = null;
}
launch() {
let propPet = GameUtil.require_ex('../../conf/prop_data/prop_pet');
for (let petid in propPet) {
if (propPet.hasOwnProperty(petid)) {
try {
let petdata = propPet[petid];
petdata.rate = SKDataUtil.jsonBy(petdata.rate);
petdata.hp = SKDataUtil.jsonBy(petdata.hp);
petdata.mp = SKDataUtil.jsonBy(petdata.mp);
petdata.atk = SKDataUtil.jsonBy(petdata.atk);
petdata.spd = SKDataUtil.jsonBy(petdata.spd);
petdata.needitem = petdata.gettype == 1 ? SKDataUtil.jsonBy(petdata.needitem) : [];
petdata.wuxing = SKDataUtil.jsonBy(petdata.wuxing);
this.pet_data_list[petid] = petdata;
} catch (error) {
SKLogger.warn(`召唤兽[${petid}]配置错误!`);
}
}
}
let propPetColor = GameUtil.require_ex('../../conf/prop_data/prop_pet_color');
for (let petid in propPetColor) {
if (propPetColor.hasOwnProperty(petid)) {
try {
let colorValue = propPetColor[petid].colorValue.split(',');
let colorNice = propPetColor[petid].colorNice.split(',');
this.pet_color_list[petid] = {
colorValue: colorValue,
colorNice: colorNice,
};
} catch (error) {
SKLogger.warn(`召唤兽[${petid}]换色配置错误!`);
}
}
}
SKLogger.info(`召唤兽管理模块加载完毕!`);
}
getPetData(petid: any): any {
return this.pet_data_list[petid];
}
canHeCheng(role: Player, petid: any) {
if (role.petList.length >= GameUtil.limitPetNum) {
role.send('s2c_notice', {
strRichText: `携带召唤兽已达上限!`
});
return false;
}
let petdata = this.getPetData(petid);
let curitems = SKDataUtil.clone(role.bag_list);
for (const itemid of petdata.needitem) {
if (!curitems[itemid]) {
return false;
}
curitems[itemid]--;
}
let logstr = `玩家[${role.name}(${role.roleid})] 消耗`;
for (const itemid of petdata.needitem) {
role.bag_list[itemid]--;
let iteminfo = ItemUtil.getItemData(itemid);
if (iteminfo) {
logstr += `${iteminfo.name}`;
}
logstr += `(${itemid})`;
}
return true;
}
getNextRate(rate: any, dataid: any) {
let petdata = this.getPetData(dataid);
let rate2 = petdata.rate[1] * 10000;
return GameUtil.random(rate, rate2);
}
getMaxSkillCnt(dataid: any) {
let petdata = this.getPetData(dataid);
if (petdata.maxskillcnt) {
return petdata.maxskillcnt;
}
return 4;
}
/*
* 获取宠物最大成长率
* @param dataid 宠物dataid
*/
getMaxRate(dataid: any) {
let petdata = this.getPetData(dataid);
let rate2 = petdata.rate[1] * 10000;
return rate2;
}
getBaseAttr(dataid: any) {
let petdata = this.getPetData(dataid);
let rate1 = petdata.rate[0] * 10000;
let rate2 = petdata.rate[1] * 10000;
let ret: any = {};
let r = GameUtil.random(0, 10000);
if (r < 200) {
ret.rate = rate2;
} else {
ret.rate = GameUtil.random(rate1, rate2);
}
ret.hp = GameUtil.random(petdata.hp[0], petdata.hp[1]);
ret.mp = GameUtil.random(petdata.mp[0], petdata.mp[1]);
ret.atk = GameUtil.random(petdata.atk[0], petdata.atk[1]);
ret.spd = GameUtil.random(petdata.spd[0], petdata.spd[1]);
ret.aptitude = this.getAptitude(dataid,ret);
return ret;
}
// 获取宠物洗练评分
getAptitude(dataid: any,info: any): number{
let petdata = this.getPetData(dataid);
let sum: number = petdata.hp[1] + petdata.mp[1] + petdata.atk[1] + petdata.spd[1];
let info_sum: number = info.hp + info.mp + info.atk + info.spd;
if ((sum - info_sum) <= 0){
return Aptitude.EXCELLENT;
}else if(info_sum > (sum * 0.75)) {
return Aptitude.MEDIUM;
}else if(info_sum < (sum * 0.75) && info_sum > (sum * 0.5)) {
return Aptitude.ORDINARY;
}else {
return Aptitude.RUBBISH;
}
}
createPet(player: Player, petid: any, callback: any) {
if (player.petList.length >= GameUtil.limitPetNum) {
return;
}
// let nextId= GameUtil.nextId();
let nextId= SKDataUtil.rolePrimaryKey(14);
let pet = new Pet(petid);
pet.petid = nextId;
pet.dataid = petid;
pet.owner = player;
pet.ownid = player.roleid;
let petdata = this.getPetData(petid);
if (petdata != null && petdata != undefined){
pet.resid = petdata.resid;
pet.name = petdata.name;
pet.grade = petdata.grade;
pet.level = 0;
let baseattr = this.getBaseAttr(petid);
pet.rate = baseattr.rate;
pet.hp = baseattr.hp;
pet.mp = baseattr.mp;
pet.atk = baseattr.atk;
pet.spd = baseattr.spd;
pet.basehp = pet.hp;
pet.basemp = pet.mp;
pet.baseatk = pet.atk;
pet.basespd = pet.spd;
if(pet.grade >= 3){
if (petdata.shenskill != null){
pet.shenskill = petdata.shenskill;
}else {
pet.shenskill = 3006;
}
}
pet.skill_list = {};
if (petdata.skill != null && petdata.skill != '' && petdata.skill != 0) {
pet.skill_list[petdata.skill] = { idx: 0, lck: 0 };
}
pet.calculateAttribute();
DB.createPet(pet.toObj(), (ret: any) => {
if (ret != MsgCode.SUCCESS) {
SKLogger.debug(`玩家[${player.roleid}:${player.name})]召唤兽[${pet.name}]创建失败!`);
}
});
callback(pet);
}else {
callback(null);
}
}
getMaxLongGu(relive: any): number {
if (relive == 0) return 2;
if (relive == 1) return 4;
if (relive == 2) return 7;
if (relive == 3) return 12;
if (relive == 4) return 12;
return 0;
}
getPetColors(petid: any): any {
if (this.pet_color_list[petid]) {
return this.pet_color_list[petid];
}
else {
SKLogger.warn(`未找到召唤兽[${petid}]的宠物颜色!`);
return { colorValue: [0], colorNice: [0], };
}
}
}