1429 lines
55 KiB
TypeScript
Raw Normal View History

2025-04-23 09:34:08 +08:00
import BattleObj from "./BattleObj";
import PetMgr from "../core/PetMgr";
import GoodsMgr from "../item/GoodsMgr";
import SkillUtil from "../skill/core/SkillUtil";
import SkillBase from "../skill/core/SkillBase";
import SKDataUtil from "../gear/SKDataUtil";
import ExpUtil from "../core/ExpUtil";
import GameUtil from "../core/GameUtil";
import Player from "./Player";
import SKLogger from "../gear/SKLogger";
import Horse from "../horse/Horse";
import {
ERaceType,
EActionType,
EAttrTypeL1,
EAttrTypeL2,
ELiveingType,
MsgCode,
Operate,
ESkillType, Aptitude
} from "../role/EEnum";
import PlayerMgr from "../object/PlayerMgr";
import SKCxfUtil from "../gear/SKCxfUtil";
import PetSupport from "../object/PetSupport";
export default class Pet extends BattleObj {
petid: number;
dataid: number;
owner: Player;
resid: number;
intro: string;
name: string;
relive: number;
level: number;
grade: number;
qinmi: number;
skill_list: any;
rate: number;
basehp: number;
basemp: number;
baseatk: number;
basespd: number;
ppoint: any;
dpoint: any;
wuxing: any;
exp: number;
xexp: number;
xlevel: number;
longgu: number;
state: number;
maxskillcnt: number;
wash_property: any; // 洗练的属性
color: number; // -1:未变色 0:变色未成功 >0:其他颜色
fly: number; // %10飞升次数 /10飞升增加的属性 1hp 2mp 3atk 4spd
shenskill: number;
petinfo: any;
dfengyin: any;
dhunlun: any;
dhunshui: any;
dyiwang: any;
dfeng: any;
dshui: any;
dhuo: any;
ddu: any;
dlei: any;
dguihuo: any;
dsanshi: any;
dzhenshe: number;
pxishou: any;
pmingzhong: number;
pshanbi: number;
plianji: number;
plianjilv: number;
pkuangbao: number;
ppofang: number;
ppofanglv: number;
pfanzhenlv: number;
pfanzhen: number;
// 0资质平平 (比较垃圾)1出类拔萃 (一般)2妙领天机 (中等)3万中无一 (极好的)
aptitude: number;
// 坐骑管制位 0 未管制 1 坐骑1 2 坐骑2 3 坐骑3 4 坐骑4
control: number;
constructor(petid: any) {
super();
this.petid = 0;
this.dataid = petid;
this.owner = null;
this.resid = 0; // 资源id
this.intro = ''; // 介绍
this.name = '';
this.relive = 0;
this.level = 0;
this.grade = 0;
this.qinmi = 0; // 亲密
this.skill_list = {};
this.rate = 0;
this.basehp = 0; // 初始血
this.basemp = 0;
this.baseatk = 0;
this.basespd = 0;
this.ppoint = {};
this.dpoint = {};
this.wuxing = {};
this.exp = 0;
this.xexp = 0;
this.xlevel = 0;
this.longgu = 0;
this.state = 1;
this.maxskillcnt = 4;
this.wash_property = null; // 洗练的属性
this.color = -1; // -1:未变色 0:变色未成功 >0:其他颜色
// this.yuanqi = 0;
this.fly = 0; // %10飞升次数 /10飞升增加的属性 1hp 2mp 3atk 4spd
this.shenskill = 0;
this.living_type = ELiveingType.PET;
this.control = 0;
this.aptitude = 0;
}
setOwner(player: any) {
this.maxskillcnt = PetMgr.shared.getMaxSkillCnt(this.dataid);
this.owner = player;
}
setDB(info: any) {
this.petinfo = info;
if (!this.petinfo) {
return;
}
let data = PetMgr.shared.getPetData(this.dataid);
if (!data) {
SKLogger.debug(`召唤兽找不到${this.dataid}`);
return;
}
/* TODO 修复宠物属性 */
while (info.hp && info.hp > data.hp[1]) {
info.hp -= 60;
}
while (info.mp && info.mp > data.mp[1]) {
info.mp -= 60;
}
while (info.atk && info.atk > data.atk[1]) {
info.atk -= 60;
}
while (info.spd && info.spd > data.spd[1]) {
info.spd -= 60;
}
info.petid && (this.petid = info.petid);
info.dataid && (this.dataid = info.dataid);
info.resid && (this.resid = info.resid);
info.intro && (this.intro = info.intro);
info.name && (this.name = info.name);
info.relive && (this.relive = info.relive);
info.level && (this.level = info.level);
info.grade && (this.grade = info.grade);
info.shenskill && (this.shenskill = info.shenskill);
let skillList = SKDataUtil.jsonBy(info.skill);
this.initSkill(skillList);
info.rate && (this.rate = info.rate);
info.hp && (this.basehp = info.hp);
info.mp && (this.basemp = info.mp);
info.atk && (this.baseatk = info.atk);
info.spd && (this.basespd = info.spd);
info.ppoint && (this.ppoint = SKDataUtil.jsonBy(info.ppoint));
info.dpoint && (this.dpoint = SKDataUtil.jsonBy(info.dpoint));
info.wuxing && (this.wuxing = SKDataUtil.jsonBy(info.wuxing));
info.exp && (this.exp = info.exp);
info.xexp && (this.xexp = info.xexp);
info.xlevel && (this.xlevel = info.xlevel);
info.longgu && (this.longgu = info.longgu);
info.maxskillcnt && (this.maxskillcnt = info.maxskillcnt);
if (SKDataUtil.isNumber(info.color)) {
this.color = this.petColorTransformCom(info.color);
}
// if (this.color != -1) {
// this.yuanqi = goodsMgr.getPetUseYuanqiRate(this.dataid);
// }
this.aptitude = PetMgr.shared.getAptitude(this.dataid, info);
info.aptitude = this.aptitude;
info.qinmi && (this.qinmi = info.qinmi);
if (typeof (info.fly) == 'number') {
this.fly = info.fly;
}
this.maxskillcnt = PetMgr.shared.getMaxSkillCnt(this.dataid);
if (info.control) {
this.control = SKDataUtil.clamp(info.control, ERaceType.HUMEN, ERaceType.DRAGON);
}
this.calculateAttribute();
}
initSkill(skillinfos: any) {
for (let skillId in skillinfos) {
if (skillinfos.hasOwnProperty(skillId)) {
const skillinfo = skillinfos[skillId];
if (typeof skillinfo == 'object' && skillinfo) {
this.skill_list[skillId] = skillinfo;
}
if (typeof skillinfo == 'number') {
this.skill_list[skillId] = {
idx: skillinfo,
lck: 0
};
}
}
}
}
/*
* 使
*/
useYuanqi() {
let can_wash_rate = 1; // 能洗颜色的概率
if (this.color == -1) { // 未吃过元气丹
this.color = 0;
// this.yuanqi = goodsMgr.getPetUseYuanqiRate(this.dataid);
this.calculateAttribute();
can_wash_rate = 0.1;
}
if (Math.random() < can_wash_rate || this.getCurRate() == this.getMaxRate()) {
this.color = this.changeColor();
}
if (this.owner) {
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
SKCxfUtil.getCxfRecordOperate({
roleId: this.owner.roleid,
roleName: this.owner.name,
operateType: Operate.ITEM,
operateDepict: "元气丹",
operateResSerial: this.petid,
operateResName: this.name,
operateContent: SKDataUtil.toJson(this.toObj(), "{}")
})
return true;
} else {
return false;
}
}
/*
*
*/
changeColor() {
let colors = PetMgr.shared.getPetColors(this.resid);
let common_colors = colors.colorValue; // 普通颜色
let special_colors = colors.colorNice; // 特殊颜色
let random = Math.random();
let rate = 0.9; // 普通颜色的概率
let color = 0;
if (random < rate) {
color = parseInt(common_colors[Math.floor(Math.random() * common_colors.length)]);
} else {
color = parseInt(special_colors[Math.floor(Math.random() * special_colors.length)]);
}
return color;
}
calculateAttribute() {
let player = this.owner
GameUtil.clearAllAttr(this.attr1);
this.dpoint[EAttrTypeL2.GENGU] = this.dpoint[EAttrTypeL2.GENGU] || 0;
this.dpoint[EAttrTypeL2.LINGXING] = this.dpoint[EAttrTypeL2.LINGXING] || 0;
this.dpoint[EAttrTypeL2.LILIANG] = this.dpoint[EAttrTypeL2.LILIANG] || 0;
this.dpoint[EAttrTypeL2.MINJIE] = this.dpoint[EAttrTypeL2.MINJIE] || 0;
this.ppoint[EAttrTypeL2.GENGU] = this.ppoint[EAttrTypeL2.GENGU] || 0;
this.ppoint[EAttrTypeL2.LINGXING] = this.ppoint[EAttrTypeL2.LINGXING] || 0;
this.ppoint[EAttrTypeL2.LILIANG] = this.ppoint[EAttrTypeL2.LILIANG] || 0;
this.ppoint[EAttrTypeL2.MINJIE] = this.ppoint[EAttrTypeL2.MINJIE] || 0;
let cur_rate = this.getCurRate();
let calhp = Math.round(this.level * cur_rate / 10000 * (this.level + this.ppoint[EAttrTypeL2.GENGU]) + 0.7 * this.getBaseProperty('hp') * this.level * cur_rate / 10000 + this.getBaseProperty('hp'));
let calmp = Math.round(this.level * cur_rate / 10000 * (this.level + this.ppoint[EAttrTypeL2.LINGXING]) + 0.7 * this.getBaseProperty('mp') * this.level * cur_rate / 10000 + this.getBaseProperty('mp'));
let calatk = Math.round(0.2 * this.level * cur_rate / 10000 * (this.level + this.ppoint[EAttrTypeL2.LILIANG]) + 0.2 * 0.7 * this.getBaseProperty('atk') * this.level * cur_rate / 10000 + this.getBaseProperty('atk'));
let calspd = Math.round((this.getBaseProperty('spd') + (this.level + this.ppoint[EAttrTypeL2.MINJIE])) * cur_rate / 10000);
this.setAttr1(EAttrTypeL1.HP, calhp);
this.setAttr1(EAttrTypeL1.HP_MAX, calhp);
this.setAttr1(EAttrTypeL1.MP, calmp);
this.setAttr1(EAttrTypeL1.MP_MAX, calmp);
this.setAttr1(EAttrTypeL1.ATK, calatk);
this.setAttr1(EAttrTypeL1.SPD, calspd);
this.dpoint[EAttrTypeL1.K_SEAL] = this.dpoint[EAttrTypeL1.K_SEAL] || 0;
this.dpoint[EAttrTypeL1.K_CONFUSION] = this.dpoint[EAttrTypeL1.K_CONFUSION] || 0;
this.dpoint[EAttrTypeL1.K_SLEEP] = this.dpoint[EAttrTypeL1.K_SLEEP] || 0;
this.dpoint[EAttrTypeL1.K_FORGET] = this.dpoint[EAttrTypeL1.K_FORGET] || 0;
this.dpoint[EAttrTypeL1.K_DETER] = this.dpoint[EAttrTypeL1.K_DETER] || 0;
this.dfengyin = this.dpoint[EAttrTypeL1.K_SEAL] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_SEAL) + this.ofudaQingLan(EAttrTypeL1.K_SEAL);
this.dhunlun = this.dpoint[EAttrTypeL1.K_CONFUSION] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_CONFUSION) + this.ofudaQingLan(EAttrTypeL1.K_CONFUSION);
this.dhunshui = this.dpoint[EAttrTypeL1.K_SLEEP] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_SLEEP) + this.ofudaQingLan(EAttrTypeL1.K_SLEEP);
this.dyiwang = this.dpoint[EAttrTypeL1.K_FORGET] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_FORGET) + this.ofudaQingLan(EAttrTypeL1.K_FORGET);
this.dzhenshe = this.dpoint[EAttrTypeL1.K_DETER] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_DETER);
this.setAttr1(EAttrTypeL1.K_SEAL, this.dfengyin);
this.setAttr1(EAttrTypeL1.K_CONFUSION, this.dhunlun);
this.setAttr1(EAttrTypeL1.K_SLEEP, this.dhunshui);
this.setAttr1(EAttrTypeL1.K_FORGET, this.dyiwang);
this.setAttr1(EAttrTypeL1.K_DETER, this.dzhenshe);
this.dpoint[EAttrTypeL1.K_WIND] = this.dpoint[EAttrTypeL1.K_WIND] || 0;
this.dpoint[EAttrTypeL1.K_WATER] = this.dpoint[EAttrTypeL1.K_WATER] || 0;
this.dpoint[EAttrTypeL1.K_FIRE] = this.dpoint[EAttrTypeL1.K_FIRE] || 0;
this.dpoint[EAttrTypeL1.K_POISON] = this.dpoint[EAttrTypeL1.K_POISON] || 0;
this.dpoint[EAttrTypeL1.K_THUNDER] = this.dpoint[EAttrTypeL1.K_THUNDER] || 0;
this.dpoint[EAttrTypeL1.K_WILDFIRE] = this.dpoint[EAttrTypeL1.K_WILDFIRE] || 0;
this.dpoint[EAttrTypeL1.K_BLOODRETURN] = this.dpoint[EAttrTypeL1.K_BLOODRETURN] || 0;
this.dfeng = this.dpoint[EAttrTypeL1.K_WIND] * 4;
this.dshui = this.dpoint[EAttrTypeL1.K_WATER] * 4;
this.dhuo = this.dpoint[EAttrTypeL1.K_FIRE] * 4;
this.ddu = this.dpoint[EAttrTypeL1.K_POISON] * 4;
this.dlei = this.dpoint[EAttrTypeL1.K_THUNDER] * 4;
this.dguihuo = this.dpoint[EAttrTypeL1.K_WILDFIRE] * 4;
this.dsanshi = this.dpoint[EAttrTypeL1.K_BLOODRETURN] * 4;
this.setAttr1(EAttrTypeL1.K_WIND, this.dfeng);
this.setAttr1(EAttrTypeL1.K_WATER, this.dshui);
this.setAttr1(EAttrTypeL1.K_FIRE, this.dhuo);
this.setAttr1(EAttrTypeL1.K_POISON, this.ddu);
this.setAttr1(EAttrTypeL1.K_THUNDER, this.dlei);
this.setAttr1(EAttrTypeL1.K_WILDFIRE, this.dguihuo);
this.setAttr1(EAttrTypeL1.K_BLOODRETURN, this.dsanshi);
this.dpoint[EAttrTypeL1.PHY_GET] = this.dpoint[EAttrTypeL1.PHY_GET] || 0;
this.dpoint[EAttrTypeL1.PHY_HIT] = this.dpoint[EAttrTypeL1.PHY_HIT] || 0;
this.dpoint[EAttrTypeL1.PHY_DODGE] = this.dpoint[EAttrTypeL1.PHY_DODGE] || 0;
this.dpoint[EAttrTypeL1.PHY_COMBO] = this.dpoint[EAttrTypeL1.PHY_COMBO] || 0;
this.dpoint[EAttrTypeL1.PHY_COMBO_PROB] = this.dpoint[EAttrTypeL1.PHY_COMBO_PROB] || 0;
this.dpoint[EAttrTypeL1.PHY_DEADLY] = this.dpoint[EAttrTypeL1.PHY_DEADLY] || 0;
this.dpoint[EAttrTypeL1.PHY_BREAK] = this.dpoint[EAttrTypeL1.PHY_BREAK] || 0;
this.dpoint[EAttrTypeL1.PHY_BREAK_PROB] = this.dpoint[EAttrTypeL1.PHY_BREAK_PROB] || 0;
this.dpoint[EAttrTypeL1.PHY_REBOUND_PROB] = this.dpoint[EAttrTypeL1.PHY_REBOUND_PROB] || 0;
this.dpoint[EAttrTypeL1.PHY_REBOUND] = this.dpoint[EAttrTypeL1.PHY_REBOUND] || 0;
this.pxishou = this.dpoint[EAttrTypeL1.PHY_GET] * 3;
this.pmingzhong = 80 + this.dpoint[EAttrTypeL1.PHY_HIT] * 1.5 + player.checkPetOfudaUseState(this, EAttrTypeL1.PHY_HIT);
this.pshanbi = this.dpoint[EAttrTypeL1.PHY_DODGE] * 1.5;
this.plianji = 3 + this.dpoint[EAttrTypeL1.PHY_COMBO] * 1;
this.plianjilv = this.dpoint[EAttrTypeL1.PHY_COMBO_PROB] * 1.5;
this.pkuangbao = this.dpoint[EAttrTypeL1.PHY_DEADLY] * 1.5;
this.ppofang = this.dpoint[EAttrTypeL1.PHY_BREAK] * 3 + player.checkPetOfudaUseState(this, EAttrTypeL1.PHY_BREAK);
this.ppofanglv = this.dpoint[EAttrTypeL1.PHY_BREAK_PROB] * 3 + player.checkPetOfudaUseState(this, EAttrTypeL1.PHY_BREAK_PROB);
this.pfanzhenlv = this.dpoint[EAttrTypeL1.PHY_REBOUND_PROB] * 4;
this.pfanzhen = this.dpoint[EAttrTypeL1.PHY_REBOUND] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.PHY_REBOUND);
this.setAttr1(EAttrTypeL1.PHY_GET, this.pxishou);
this.setAttr1(EAttrTypeL1.PHY_HIT, this.pmingzhong);
this.setAttr1(EAttrTypeL1.PHY_DODGE, this.pshanbi);
this.setAttr1(EAttrTypeL1.PHY_COMBO, this.plianji);
this.setAttr1(EAttrTypeL1.PHY_COMBO_PROB, this.plianjilv);
this.setAttr1(EAttrTypeL1.PHY_DEADLY, this.pkuangbao);
this.setAttr1(EAttrTypeL1.PHY_BREAK, this.ppofang);
this.setAttr1(EAttrTypeL1.PHY_BREAK_PROB, this.ppofanglv);
this.setAttr1(EAttrTypeL1.PHY_REBOUND_PROB, this.pfanzhenlv);
this.setAttr1(EAttrTypeL1.PHY_REBOUND, this.pfanzhen);
this.maxhp = this.getBaseProperty('hp');
this.maxmp = this.getBaseProperty('mp');
this.maxexp = ExpUtil.getSummonUpGradeExp(this.relive, this.level);
this.calcPassiveSkillAttr();
this.calcHorseSkillAttr();
player.ZFMgr.calculateActiveZhenFaForPet(this.attr1)
}
// 计算被动技能属性
calcPassiveSkillAttr() {
let skill_list = this.getActualSkill(this.skill_list)
for (let skillId in skill_list) {
let skill = SkillUtil.getSkill(skillId);
this.checkSkill(skill, "召唤兽");
}
if (this.shenskill != 0) {
let skill = SkillUtil.getSkill(this.shenskill);
this.checkSkill(skill, "神兽");
}
}
// 获取已经学会的技能
getActualSkill(skill_list: any): any {
let skill: any = {};
for (let key in skill_list) {
if (key != skill_list[key].idx) {
skill[key] = skill_list[key];
}
}
return skill;
}
// 计算坐骑技能属性
calcHorseSkillAttr() {
if (this.control < 1) {
return;
}
if (this.owner == null) {
return;
}
let horse = this.owner.horseList.getHorse(this.control);
if (horse == null) {
return;
}
let skillList = this.owner.horseSkill.getList(this.control);
for (let skill of skillList) {
this.checkHorseSkill(skill, horse);
}
}
checkSkill(skill: SkillBase, prefix: string) {
if (skill == null) {
return;
}
if (skill.action_type != EActionType.PASSIVE) {
return;
}
let effectMap = skill.effectMap;
for (let key in effectMap) {
let type: EAttrTypeL1 = SKDataUtil.numberBy(key);
let params: any = {
type: type,
level: this.level,
relive: this.relive,
qinmi: this.qinmi
};
let ret = skill.getEffect(params);
if (ret.add) {
let old = SKDataUtil.toDecimal2(this.attr1[type]);
this.attr1[type] = SKDataUtil.toDecimal2(old + ret.add);
let current = this.attr1[type];
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}][${GameUtil.attrTypeL1Name[type]}]改变[${ret.add}]:${old}->${current}`);
let oldHP = this.attr1[EAttrTypeL1.HP];
let oldMP = this.attr1[EAttrTypeL1.MP];
let oldATK = this.attr1[EAttrTypeL1.ATK];
let oldSPD = this.attr1[EAttrTypeL1.SPD];
if (type == EAttrTypeL1.HP_MAX) {
this.attr1[EAttrTypeL1.HP] = this.attr1[EAttrTypeL1.HP_MAX];
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]气血最大值改变:${oldHP}->${this.attr1[EAttrTypeL1.HP]}`);
} else if (type == EAttrTypeL1.MP_MAX) {
this.attr1[EAttrTypeL1.MP] = this.attr1[EAttrTypeL1.MP_MAX];
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]法力最大值改变:${oldMP}->${this.attr1[EAttrTypeL1.MP]}`);
} else if (type == EAttrTypeL1.HP_PERC) {
this.attr1[EAttrTypeL1.HP] = Math.floor(this.attr1[EAttrTypeL1.HP_MAX] * (1 + ret.add / 100));
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]气血百分比改变:${oldHP}->${this.attr1[EAttrTypeL1.HP]}`);
} else if (type == EAttrTypeL1.MP_PERC) {
this.attr1[EAttrTypeL1.MP] = Math.floor(this.attr1[EAttrTypeL1.MP_MAX] * (1 + ret.add / 100));
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]法力百分比改变:${oldMP}->${this.attr1[EAttrTypeL1.MP]}`);
} else if (type == EAttrTypeL1.ATK_PERC) {
this.attr1[EAttrTypeL1.ATK] = Math.floor(this.attr1[EAttrTypeL1.ATK] * (1 + ret.add / 100));
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]攻击百分比改变:${oldATK}->${this.attr1[EAttrTypeL1.ATK]}`);
} else if (type == EAttrTypeL1.SPD_PERC) {
this.attr1[EAttrTypeL1.SPD] = Math.floor(this.attr1[EAttrTypeL1.SPD] * (1 + ret.add / 100));
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]速度百分比改变:${oldSPD}->${this.attr1[EAttrTypeL1.SPD]}`);
}
}
}
}
// 检查坐骑技能
checkHorseSkill(skill: SkillBase, horse: Horse) {
if (skill == null) {
return;
}
if (skill.action_type != EActionType.PASSIVE) {
return;
}
let effectMap = skill.effectMap;
for (let key in effectMap) {
let type: EAttrTypeL1 = SKDataUtil.numberBy(key);
let ret = skill.getHorseEffect(type, horse.level, skill.exp);
if (ret.add) {
let old = SKDataUtil.toDecimal2(this.attr1[type]);
this.attr1[type] = SKDataUtil.toDecimal2(old + ret.add);
let current: number = this.attr1[type];
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}][${GameUtil.attrTypeL1Name[type]}]改变[${ret.add}]:${old}->${current}`);
let oldHP = this.attr1[EAttrTypeL1.HP];
let oldMP = this.attr1[EAttrTypeL1.MP];
let oldATK = this.attr1[EAttrTypeL1.ATK];
let oldSPD = this.attr1[EAttrTypeL1.SPD];
if (type == EAttrTypeL1.HP_MAX) {
this.attr1[EAttrTypeL1.HP] = this.attr1[EAttrTypeL1.HP_MAX];
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]气血最大值改变:${oldHP}->${this.attr1[EAttrTypeL1.HP]}`);
} else if (type == EAttrTypeL1.MP_MAX) {
this.attr1[EAttrTypeL1.MP] = this.attr1[EAttrTypeL1.MP_MAX];
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]法力最大值改变:${oldMP}->${this.attr1[EAttrTypeL1.MP]}`);
} else if (type == EAttrTypeL1.HP_PERC) {
this.attr1[EAttrTypeL1.HP] = Math.floor(this.attr1[EAttrTypeL1.HP_MAX] * (1 + ret.add / 100));
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]气血百分比改变:${oldHP}->${this.attr1[EAttrTypeL1.HP]}`);
} else if (type == EAttrTypeL1.MP_PERC) {
this.attr1[EAttrTypeL1.MP] = Math.floor(this.attr1[EAttrTypeL1.MP_MAX] * (1 + ret.add / 100));
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]法力百分比改变:${oldMP}->${this.attr1[EAttrTypeL1.MP]}`);
} else if (type == EAttrTypeL1.ATK_PERC) {
this.attr1[EAttrTypeL1.ATK] = Math.floor(this.attr1[EAttrTypeL1.ATK] * (1 + ret.add / 100));
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]攻击百分比改变:${oldATK}->${this.attr1[EAttrTypeL1.ATK]}`);
} else if (type == EAttrTypeL1.SPD_PERC) {
this.attr1[EAttrTypeL1.SPD] = Math.floor(this.attr1[EAttrTypeL1.SPD] * (1 + ret.add / 100));
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]速度百分比改变:${oldSPD}->${this.attr1[EAttrTypeL1.SPD]}`);
}
}
}
}
//天演策技能
checkOfudaSkill(skill: SkillBase,addition: number, addi: number){
if (skill == null) {
return 0;
}
if (skill.action_type != EActionType.PASSIVE) {
return 0;
}
let liliang = this.ppoint[EAttrTypeL2.LILIANG];
let lingxing = this.ppoint[EAttrTypeL2.LINGXING];
let gengu = this.ppoint[EAttrTypeL2.GENGU];
if(skill.skill_id == ESkillType.MengGong1){
let num = Math.floor(((liliang / 100 * 0.03) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.MengGong2){
let num = Math.floor(((liliang / 100 * 0.05) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.MengGong3){
let num = Math.floor(((liliang / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.KanPo1){
let num = Math.floor(((liliang / 100 * 0.02) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.KanPo2){
let num = Math.floor(((liliang / 100 * 0.05) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.KanPo3){
let num = Math.floor(((liliang / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.JingZhun1){
let num = Math.floor(((liliang / 100 * 0.02) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.JingZhun2){
let num = Math.floor(((liliang / 100 * 0.05) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.JingZhun3){
let num = Math.floor(((liliang / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.HuWei1){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.HuWei2){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.HuWei3){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.LianXi1){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.LianXi2){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.LianXi3){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.HuiGen1){
let num = Math.floor(((lingxing / 100 * 0.02) * addition) * (addi * 0.1)) + Math.floor(((gengu / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.HuiGen2){
let num = Math.floor(((lingxing / 100 * 0.05) * addition) * (addi * 0.1)) + Math.floor(((gengu / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.HuiGen3){
let num = Math.floor(((lingxing / 100 * 0.08) * addition) * (addi * 0.1)) + Math.floor(((gengu / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
return 0;
}
toObj() {
let obj: any = {};
if (this.grade == 4 && this.shenskill == 0) {
this.shenskill = 3005;
}
obj.petid = this.petid;
obj.dataid = this.dataid;
obj.onlyid = this.onlyid;
obj.ownid = this.owner.roleid;
obj.name = this.name;
obj.relive = this.relive;
obj.level = this.level;
obj.resid = this.resid;
obj.grade = this.grade;
obj.skill = SKDataUtil.toJson(this.skill_list, "{}");
obj.ppoint = SKDataUtil.toJson(this.ppoint, "{}");
obj.dpoint = SKDataUtil.toJson(this.dpoint, "{}");
obj.wuxing = SKDataUtil.toJson(this.wuxing, "{}");
obj.exp = this.exp;
obj.rate = this.getCurRate();
obj.maxrate = this.getMaxRate();
obj.hp = this.getBaseProperty('hp');
obj.mp = this.getBaseProperty('mp');
obj.atk = this.getBaseProperty('atk');
obj.spd = this.getBaseProperty('spd');
obj.intro = this.intro;
obj.xexp = this.xexp;
obj.xlevel = this.xlevel;
obj.longgu = this.longgu;
obj.maxskillcnt = this.maxskillcnt;
obj.attr1 = SKDataUtil.toJson(this.attr1, "{}");
obj.shenskill = this.shenskill;
obj.color = this.color;
obj.qinmi = this.qinmi;
obj.fly = this.fly;
obj.control = this.control;
obj.aptitude = this.aptitude;
return obj;
}
//宝宝转生
petRelive() {
if (!this.owner) {
return;
}
let nextlive = this.relive + 1;
if (nextlive > 4) { //最大转生4
this.owner.send('s2c_notice', {
//更高转生等级暂未开放
strRichText: MsgCode.RELIVE_LEVEL_TOO_HIGH + ''
});
return;
}
if (nextlive > this.owner.relive) {
this.owner.send('s2c_notice', {
strRichText: `角色转生等级不足!`
});
return;
}
if (this.level < ExpUtil.getSummonMaxGrade(this.relive)) { //等级不够
this.owner.send('s2c_notice', {
strRichText: MsgCode.RELIVE_LEVEL_NOT_ENOUGH + ''
});
return;
}
let maxrate = this.getMaxRate();
if (this.rate > maxrate) {
this.rate = maxrate;
}
this.relive = nextlive;
this.level = ExpUtil.getSummonGradeStart(this.relive);
for (const key in this.ppoint) {
this.ppoint[key] = 0;
}
this.addExp(0);
this.calculateAttribute();
let info = `您的召唤兽[${this.name}]${this.relive < 4 ? `${this.relive}` : "飞升"}成功!`
this.owner.send('s2c_notice', {
strRichText: info
});
}
/*
*
*/
washProperty() {
if (!this.owner) {
return;
}
let data = PetMgr.shared.getBaseAttr(this.dataid);
let petData = PetMgr.shared.getPetData(this.dataid);
this.wash_property = SKDataUtil.clone(data); // 保存的属性不能+60
switch (parseInt("" + this.fly / 10)) { // 神兽飞升
case 1:
data.hp += 60;
if(data.hp > petData.hp[1]){
data.hp = petData.hp[1];
}
break;
case 2:
data.mp += 60;
if(data.mp > petData.mp[1]){
data.mp = petData.mp[1];
}
break;
case 3:
data.atk += 60;
if(data.atk > petData.atk[1]){
data.atk = petData.atk[1];
}
break;
case 4:
data.spd += 60;
if(data.spd > petData.spd[1]){
data.spd = petData.spd[1];
}
break;
}
data.rate += this.getRateAdd();
data.maxrate = this.getMaxRate(); // 元气丹可以影响最大成长率
if (data.rate > data.maxrate) {
data.rate = data.maxrate;
}
if (data.aptitude == Aptitude.EXCELLENT){
data.rate = data.maxrate;
}
this.owner.send('s2c_wash_petproperty', data);
}
highWashProperty() {
if (!this.owner) {
return;
}
let list = [];
let petData = PetMgr.shared.getPetData(this.dataid);
for(let i = 0; i < 6; i++){
let data = PetMgr.shared.getBaseAttr(this.dataid);
this.wash_property = SKDataUtil.clone(data); // 保存的属性不能+60
switch (parseInt("" + this.fly / 10)) { // 神兽飞升
case 1:
data.hp += 60;
if(data.hp > petData.hp[1]){
data.hp = petData.hp[1];
}
break;
case 2:
data.mp += 60;
if(data.mp > petData.mp[1]){
data.mp = petData.mp[1];
}
break;
case 3:
data.atk += 60;
if(data.atk > petData.atk[1]){
data.atk = petData.atk[1];
}
break;
case 4:
data.spd += 60;
if(data.spd > petData.spd[1]){
data.spd = petData.spd[1];
}
break;
}
data.rate += this.getRateAdd();
data.maxrate = this.getMaxRate(); // 元气丹可以影响最大成长率
if (data.rate > data.maxrate) {
data.rate = data.maxrate;
}
if (data.aptitude == Aptitude.EXCELLENT){
data.rate = data.maxrate;
}
list.push(data);
}
this.owner.send('s2c_highwash_petproperty', {data: SKDataUtil.toJson(list,"{}")});
}
playerChangePetName(name: any) {
this.name = name;
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
}
/*
*
*/
saveProperty(data: any) {
if (!this.owner) {
return;
}
if(data.info){
this.wash_property = SKDataUtil.jsonBy(data.info);
}
let petdata = PetMgr.shared.getPetData(this.dataid);
if (this.wash_property) {
this.rate = this.wash_property.rate;
this.basehp = this.wash_property.hp;
this.basemp = this.wash_property.mp;
this.basespd = this.wash_property.spd;
this.baseatk = this.wash_property.atk;
this.aptitude = this.wash_property.aptitude;
this.calculateAttribute();
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
let ret_data = {
errcode: MsgCode.SUCCESS,
petid: this.petid,
rate: this.getCurRate(),
maxrate: this.getMaxRate(),
hp: this.getBaseProperty('hp'),
mp: this.getBaseProperty('mp'),
spd: this.getBaseProperty('spd'),
atk: this.getBaseProperty('atk'),
aptitude: this.wash_property.aptitude,
};
if(ret_data.rate > ret_data.maxrate){
ret_data.rate = ret_data.maxrate;
}
if(ret_data.hp > petdata.hp[1]){
ret_data.hp = petdata.hp[1];
}
if(ret_data.mp > petdata.mp[1]){
ret_data.mp = petdata.mp[1];
}
if(ret_data.atk > petdata.atk[1]){
ret_data.atk = petdata.atk[1];
}
if(ret_data.spd > petdata.spd[1]){
ret_data.spd = petdata.spd[1];
}
this.owner.send('s2c_save_petproperty', ret_data);
this.wash_property = null;
}
return;
}
useLongGu() {
if (this.longgu < PetMgr.shared.getMaxLongGu(this.relive)) {
this.longgu += 1;
this.calculateAttribute();
if (this.owner) {
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
}
return true;
}
return false;
}
toSaveObj(): any {
let result: any = {};
if (this.grade == 4 && this.shenskill == 0) {
this.shenskill = 3005;
}
result.petid = this.petid;
result.name = this.name;
result.dataid = this.dataid;
result.relive = this.relive;
result.level = this.level;
result.resid = this.resid;
result.color = this.petColorTransformDB(this.color);
result.grade = this.grade;
result.roleid = this.owner.roleid;
result.fly = this.fly;
result.qinmi = this.qinmi;
result.shenskill = this.shenskill;
result.skill = SKDataUtil.toJson(this.skill_list, "{}");
result.ppoint = SKDataUtil.toJson(this.ppoint, "{}");
result.dpoint = SKDataUtil.toJson(this.dpoint, "{}");
result.rate = this.rate;
result.hp = this.basehp;
result.mp = this.basemp;
result.atk = this.baseatk;
result.spd = this.basespd;
result.wuxing = SKDataUtil.toJson(this.wuxing, "{}");
result.exp = this.exp;
result.xexp = this.xexp;
result.xlevel = this.xlevel;
result.longgu = this.longgu;
result.control = this.control;
return result;
}
addExp(exp: any): boolean {
if (exp == 0) {
return false;
}
//检查星阵是否装备赤马阵, 经验获得加成
if (exp > 0 && this.owner && this.owner.StarMgr.EquipID == 5){
let star = this.owner.StarMgr.GetStarByID(5)
let buf = star.Level * 0.003
exp = Math.floor(exp * (1 + buf))
}
let maxlevel = ExpUtil.getSummonMaxGrade(this.relive);
let plevel = this.owner == null ? 0 : this.owner.level;
let prelive = this.owner == null ? 0 : this.owner.relive;
if (this.relive >= prelive) {
maxlevel = Math.min(maxlevel, plevel + 10);
}
let upexp = ExpUtil.getSummonUpGradeExp(this.relive, this.level);
if (this.level >= maxlevel && this.exp >= upexp) { //超过本次转生的最大等级
return false;
}
this.exp += exp;
let isleavelup = false;
while (this.exp >= upexp) {
this.exp -= upexp;
this.level++;
if (this.level > maxlevel) {
this.level = maxlevel;
this.exp = ExpUtil.getSummonUpGradeExp(this.relive, this.level);
break;
}
isleavelup = true;
upexp = ExpUtil.getSummonUpGradeExp(this.relive, this.level);
}
if (isleavelup) {
this.owner.send('s2c_notice', {
strRichText: `您的召唤兽[color=#00FF00]${this.name}[/color]等级升到了[color=#00FF00]${this.level}[/color]级!`
});
}
this.calculateAttribute();
if (this.owner) {
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
}
this.owner.send('s2c_notice', {
strRichText: `你的召唤[color=#00FF00]${this.name}[/color]获得了[img]ui://main_ui/ui_common_icon_exppet[/img][color=#00FF00]${exp}[/color]`
});
this.owner.refresh_team_data();
return true;
}
getSkillNum() {
return Object.keys(this.skill_list).length;
}
// 开启宠物技能格子
openSkillGrid(index: any) {
let skillnum = this.getSkillNum();
if (skillnum >= this.maxskillcnt) {
this.send('s2c_notice', {
strRichText: `宠物技能栏已全部开启`
});
return;
} else {
this.skill_list[index] = {
idx: index,
lck: 0
};
this.owner.send("s2c_pet_skill_grid", {
petInfo: SKDataUtil.toJson(this.toObj(), "{}"),
type: 1
})
return;
}
}
// 宠物学习技能书
learnSkill(skillid: any) {
let skilldata: SkillBase = SkillUtil.getSkill(skillid);
if (skilldata == null) {
return false;
}
if (this.skill_list[skillid] != null) {
this.owner.send_notice(`[color=#0fffff]${this.name}[/color]已学会 ${skilldata.skill_name}`);
return false;
}
let skillnum = this.getSkillNum();
let data = PetMgr.shared.getPetData(this.dataid);
let num = this.getAllSkill(data.skill);
if (num <= 0) {
this.owner.send_notice('请先开启宠物格子');
return false;
}
if (skilldata.kind != 0) {
for (const sid in this.skill_list) {
if (Number(sid) != 0) {
// 判断当前是否是开启的格子
if (this.skill_list[sid].idx != sid) {
// 不是格子获取技能
let info = SkillUtil.getSkill(sid);
if (info.kind == skilldata.kind) {
if (info.quality > skilldata.quality) {
return false;
}
delete this.skill_list[sid];
}
}
}
}
}
// 遗忘上一个技能
let forget_str = '';
let lastskillinfo = null;
let tmp = this.getLearnSkill() - 1;
for (const skillid in this.skill_list) {
const skillinfo = this.skill_list[skillid];
if (skillinfo.idx > tmp && skillinfo.lck == 0) {
lastskillinfo = skillinfo;
lastskillinfo.skillid = skillid;
}
}
// 遗忘的技能
let forget: any;
if (lastskillinfo && lastskillinfo.lck == 0) {
if (skillnum > 1 || skilldata.skill_id == 0 || lastskillinfo.skillid != skilldata.skill_id) {
let onerand = 10000 / (this.maxskillcnt - 1);
let rand = GameUtil.random(0, 10000);
if (rand < onerand * tmp || this.getVacantGrid() == 0) {
forget = this.skill_list[lastskillinfo.skillid];
delete this.skill_list[lastskillinfo.skillid];
skillnum--;
let lastskilldata = SkillUtil.getSkill(lastskillinfo.skillid);
if (lastskilldata) {
if (lastskilldata.skill_id == 2110 || lastskilldata.skill_id == 2010) {//遗忘了闪现技能
PetSupport.shared.deletePet(this.owner.roleid, this.petid);
}
forget_str = `,遗忘了 ${lastskilldata.skill_name} 技能`;
} else {
forget_str = `,遗忘了技能`;
}
}
}
}
// 替换技能
if (forget) {
this.skill_list[skillid] = {
idx: forget.idx,
lck: 0
};
if (skilldata.skill_id == 2110 || skilldata.skill_id == 2010) {//如果是闪现技能加入支援列表
PetSupport.shared.pushPet(this.owner.roleid, this.petid, this.name, this.resid);
}
}
// 学习新技能
else {
let index = this.getVacantGridIndex();
if (index != undefined) {
delete this.skill_list[index];
this.skill_list[skillid] = {
idx: index,
lck: 0
};
if (skillid == 2110 || skillid == 2010) {//如果是闪现技能加入支援列表
PetSupport.shared.pushPet(this.owner.roleid, this.petid, this.name, this.resid);
}
} else {
this.owner.send_notice('请先开启宠物格子');
return false;
}
}
// 通知前端
this.calculateAttribute();
this.owner.send_notice(`${this.name}习得 ${skilldata.skill_name}` + forget_str);
this.send('s2c_update_pet', {
info: this.toObj()
});
if (this.owner) {
SKLogger.debug(`玩家[${this.owner.roleid}:${this.owner.name}]的召唤兽[${this.petid}:${this.name}]习得${skilldata.skill_name}` + forget_str);
}
return true;
}
// 除了天生技能外数量
getAllSkill(skillid: any): number {
let num = 0;
for (let key in this.skill_list) {
if (key != skillid) {
num++;
}
}
return num;
}
// 已经学会的技能数量
getLearnSkill() {
let num = 0;
for (let key in this.skill_list) {
if (key != this.skill_list[key].idx) {
num++;
}
}
return num;
}
// 已经解锁格子数量
getVacantGrid() {
let num = 0;
for (let key in this.skill_list) {
if (key == this.skill_list[key].idx) {
num++;
}
}
return num;
}
// 随机获取个已经开启格子的下标
getVacantGridIndex() {
let list: any = [];
for (const sid in this.skill_list) {
if (Number(sid) != 0) {
// 判断当前是否是开启的格子
if (this.skill_list[sid].idx == sid) {
list.push(sid);
}
}
}
return list[Math.floor((Math.random() * list.length))];
}
getLockedSkillNum() {
let n = 0;
for (const skillid in this.skill_list) {
if (this.skill_list.hasOwnProperty(skillid)) {
const skillinfo = this.skill_list[skillid];
if (skillinfo.lck == 1) {
n++;
}
}
}
return n;
}
forgetSkill(skillid: any) {
let data = PetMgr.shared.getPetData(this.dataid);
//判断是否为天生技能
if (data.skill == skillid) {
let skilldata: SkillBase = SkillUtil.getSkill(skillid);
this.owner.send_notice(`天生技能[color=#0fffff]${skilldata.skill_name}[/color]不可以遗忘哦!`);
return;
}
// 获取技能
let skill = this.skill_list[skillid];
// 删除技能
delete this.skill_list[skillid];
// 重新赋值
if (skill != null){
this.skill_list[skill.idx] = {
idx: skill.idx,
lck: 0
};
}else {
SKLogger.info(`找不到召唤兽[${this.name} = [${skillid}]技能信息`)
}
let skillinfo = SkillUtil.getSkill(skillid);
this.calculateAttribute();
let str = `玩家[${this.owner.name}(${this.owner.roleid})]的召唤兽[${this.name}(${this.petid})]遗忘了`;
if (skillinfo) {
if (skillinfo.skill_id == 2110 || skillinfo.skill_id == 2010) {//遗忘了闪现技能
PetSupport.shared.deletePet(this.owner.roleid, this.petid);
}
str += `${skillinfo.skill_name}`;
this.owner.send_notice(`你的召唤兽[${this.name}]遗忘了[${skillinfo.skill_name}]`);
}
str += `(${skillid})`;
SKLogger.debug(str);
this.send('s2c_update_pet', {
info: this.toObj()
});
}
lockSkill(skillid: any) {
let skillinfo = this.skill_list[skillid];
if (skillinfo && skillinfo.lck == 0) {
skillinfo.lck = 1;
this.send('s2c_update_pet', {
info: this.toObj()
});
return true;
}
return false;
}
changeShenShouSkill(skillid: any) {
this.shenskill = skillid;
this.calculateAttribute();
}
send(event: any, data: any) {
if (this.owner) {
this.owner.send(event, data);
}
}
/*
*
*/
petColorTransformDB(color: any) {
if (!SKDataUtil.isNumber(color)) {
SKLogger.warn(`玩家[${this.owner.roleid}:${this.owner.name}]召唤兽[${this.name}]颜色异常:${color}`)
return -1;
}
if (isNaN(color)) {
SKLogger.warn(`玩家[${this.owner.roleid}:${this.owner.name}]召唤兽[${this.name}]颜色异常:${color}`)
return -1;
}
if (color > 700) {
return color;
}
return color + 2000;
}
/*
* 使
*/
petColorTransformCom(color: any) {
if (!SKDataUtil.isNumber(color)) {
color = -1;
} else if (isNaN(color)) {
color = -1;
}
if (color > 700) {
return color - 2000;
}
return color;
}
/*
*
* @param qinmi
*/
addqinmi(qinmi: number) {
if (this.qinmi < 10000000) {
SKLogger.debug(`召唤兽[${this.name}]亲密度${this.qinmi}+${qinmi}`);
this.qinmi += qinmi;
this.calculateAttribute();
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
let player = PlayerMgr.shared.getPlayerByRoleId(this.owner.roleid);
if (player) {
let pet = player.getPetByID(this.petid);
SKCxfUtil.getCxfRecordOperate({
roleId: player.roleid,
roleName: player.name,
operateType: Operate.PET,
operateDepict: "亲密丹",
operateResSerial: this.petid,
operateResName: this.name,
operateContent: SKDataUtil.toJson(pet.toObj(), "{}")
})
}
return true;
}
return false;
}
getMaxRate() {
let maxrate = PetMgr.shared.getMaxRate(this.dataid) + this.getRateAdd(); // 元气丹可以影响最大成长率
return maxrate;
}
// 成长增量 0.612 + 0.01 * 12 + 0.1 * 3 + 1 =
getRateAdd(): number {
let yqrate = GoodsMgr.shared.getPetUseYuanqiRate(this.dataid);
yqrate = this.color == -1 ? 0 : yqrate;
let addrate = this.relive * 1000 + this.longgu * 100 + yqrate * 1000;
addrate += (this.fly % 10 >= 1) ? 1000 : 0;
addrate += (this.fly % 10 >= 2) ? 500 : 0;
return addrate;
}
getCurRate(): number {
let rate = this.rate + this.getRateAdd() + this.ofudaLonghyt(); // 成长率,服务器计算
let maxrate = this.getMaxRate()
if(rate > maxrate + this.ofudaLonghyt()){
rate = maxrate + this.ofudaLonghyt();
}
return rate;
}
/*
*
*/
flyingUp(type: any) {
if (this.grade < 3 || !this.owner) {
return;
}
if (this.level >= 50 && this.relive >= 0 && this.fly % 10 == 0) { // 第一次飞升
++this.fly;
type = 0;
this.owner.send('s2c_notice', {strRichText: '第一次飞升成功!'});
} else if (this.level >= 100 && this.relive >= 1 && this.fly % 10 == 1) { // 第二次飞升
++this.fly;
type = 0;
this.owner.send('s2c_notice', {strRichText: '第二次飞升成功!'});
} else if (this.level >= 120 && this.relive >= 2 && this.fly % 10 == 2) { // 第三次飞升
if (this.owner.money < 5000000) {
this.owner.send('s2c_notice', {strRichText: '银两不足'});
return;
}
this.owner.send('s2c_notice', {strRichText: '第三次飞升成功!'});
++this.fly;
} else if (this.level >= 120 && this.relive >= 2 && this.fly % 10 == 3) { // 不是修改属性
if (this.owner.money < 5000000) {
this.owner.send('s2c_notice', {strRichText: '银两不足'});
return;
}
this.owner.send('s2c_notice', {strRichText: '修改属性成功!'});
} else {
return;
}
if (this.fly % 10 == 3 && type != 0 && type != parseInt("" + this.fly / 10)) {
this.owner.addMoney(0, -5000000, '宠物进行飞升');
}
this.fly = type * 10 + this.fly % 10;
this.calculateAttribute();
let player = PlayerMgr.shared.getPlayerByRoleId(this.owner.roleid);
if (player) {
let pet = player.getPetByID(this.petid);
SKCxfUtil.getCxfRecordOperate({
roleId: player.roleid,
roleName: player.name,
operateType: Operate.PET,
operateDepict: "宠物飞升",
operateResSerial: this.petid,
operateResName: this.name,
operateContent: SKDataUtil.toJson(pet.toObj(), "{}")
})
}
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
}
/*
*
*/
getBaseProperty(type: any) {
let fly_property = parseInt("" + this.fly / 10);
let petData = PetMgr.shared.getPetData(this.dataid);
let ret = 0;
if (type == 1 || type == 'hp') {
ret = this.basehp + ((fly_property == 1) ? 60 : 0);
if(ret > petData.hp[1]){
ret = petData.hp[1]
}
} else if (type == 2 || type == 'mp') {
ret = this.basemp + ((fly_property == 2) ? 60 : 0);
if(ret > petData.mp[1]){
ret = petData.mp[1]
}
} else if (type == 3 || type == 'atk') {
ret = this.baseatk + ((fly_property == 3) ? 60 : 0);
if(ret > petData.atk[1]){
ret = petData.atk[1]
}
} else if (type == 4 || type == 'spd') {
ret = this.basespd + ((fly_property == 4) ? 60 : 0);
if(ret > petData.spd[1]){
ret = petData.spd[1]
}
} else if (type == 5 || type == 'aptitude') {
ret = this.aptitude + ((fly_property == 5) ? 60 : 0);
}
return ret;
}
ofudaQingLan(attr: any){
//青岚
if(this.relive == 3 && this.level >= 120 && this.level<= 180){
let add = Math.floor((this.level - 120) / 10);
if(this.owner && add > 1){
if(this.owner.checkOfudaBySkillId(ESkillType.QingLan1)){
if(attr == EAttrTypeL1.K_SEAL){
return add * 3
}
if(attr == EAttrTypeL1.K_CONFUSION){
return add * 3
}
if(attr == EAttrTypeL1.K_SLEEP){
return add * 3
}
if(attr == EAttrTypeL1.K_FORGET){
return add * 3
}
}
if(this.owner.checkOfudaBySkillId(ESkillType.QingLan2)){
if(attr == EAttrTypeL1.K_SEAL){
return add * 4
}
if(attr == EAttrTypeL1.K_CONFUSION){
return add * 4
}
if(attr == EAttrTypeL1.K_SLEEP){
return add * 4
}
if(attr == EAttrTypeL1.K_FORGET){
return add * 4
}
}
if(this.owner.checkOfudaBySkillId(ESkillType.QingLan3)){
if(attr == EAttrTypeL1.K_SEAL){
return add * 5
}
if(attr == EAttrTypeL1.K_CONFUSION){
return add * 5
}
if(attr == EAttrTypeL1.K_SLEEP){
return add * 5
}
if(attr == EAttrTypeL1.K_FORGET){
return add * 5
}
}
}
}
return 0;
}
ofudaLonghyt(){
//龙魂萦体
if(this.relive == 3 && this.level<= 180){
let add = Math.floor((this.level - 120) / 10);
if(this.owner && add > 1){
if(this.owner.checkOfudaBySkillId(ESkillType.LongHunYingTi1)){
return add * 15
}
if(this.owner.checkOfudaBySkillId(ESkillType.LongHunYingTi2)){
return add * 20
}
if(this.owner.checkOfudaBySkillId(ESkillType.LongHunYingTi3)){
return add * 40
}
}
}
return 0;
}
}