213 lines
8.2 KiB
TypeScript
213 lines
8.2 KiB
TypeScript
import SkillBase from "../skill/core/SkillBase";
|
|
import SkillUtil from "../skill/core/SkillUtil";
|
|
import DB from "../utils/DB";
|
|
import SKDataUtil from "../gear/SKDataUtil";
|
|
import Player from "../object/Player";
|
|
import SKLogger from "../gear/SKLogger";
|
|
import ItemUtil from "../core/ItemUtil";
|
|
import GameUtil from "../core/GameUtil";
|
|
import {MsgCode, Operate} from "../role/EEnum";
|
|
import SKCxfUtil from "../gear/SKCxfUtil";
|
|
|
|
export enum RefiningOperate {
|
|
REFINING = 1,
|
|
REPLACE = 2,
|
|
}
|
|
|
|
export default class HorseSkill {
|
|
|
|
static skillMax: number = 12;
|
|
owner: Player;
|
|
dict: { [key: number]: SkillBase };
|
|
|
|
constructor(player: Player) {
|
|
this.owner = player;
|
|
this.dict = {};
|
|
}
|
|
// 从数据库中读档
|
|
setDB(rows: any) {
|
|
if (rows == null) {
|
|
return;
|
|
}
|
|
if (rows.length > 0) {
|
|
for (let item of rows) {
|
|
let skill = SkillUtil.getHorseSkill(item.skill_id);
|
|
if (skill) {
|
|
skill.exp = item.exp;
|
|
this.dict[item.position] = skill;
|
|
}
|
|
}
|
|
}
|
|
let hasFixed = false;
|
|
// 修正
|
|
for (let position = 1; position <= HorseSkill.skillMax; position++) {
|
|
let skill = this.dict[position];
|
|
if (skill == null) {
|
|
let skill = SkillUtil.getRandomHorseSkill(position - 1);
|
|
if (skill) {
|
|
SKLogger.debug(`玩家[${this.owner.roleid}:${this.owner.name}]随机坐骑技能[${position}:${skill.skill_name}]`);
|
|
skill.exp = 0;
|
|
this.dict[position] = skill;
|
|
hasFixed = true;
|
|
} else {
|
|
SKLogger.debug(`玩家[${this.owner.roleid}:${this.owner.name}]随机坐骑技能[${position}]为空!`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// 存档
|
|
saveDB(callback?: (code: number, msg: string) => void) {
|
|
DB.saveHorseSkillList(this.owner.roleid, this.dict, (error: any, rows: any[]) => {
|
|
if (callback) {
|
|
if (error) {
|
|
let info = DB.errorInfo(error);
|
|
callback(MsgCode.FAILED, info);
|
|
return;
|
|
}
|
|
callback(MsgCode.SUCCESS, "");
|
|
} else {
|
|
if (error != null) {
|
|
SKLogger.warn(`存档:玩家[${this.owner.roleid}:${this.owner.name}]坐骑技能存档失败[${DB.errorInfo(error)}]!`);
|
|
} else {
|
|
SKLogger.debug(`存档:玩家[${this.owner.roleid}:${this.owner.name}]坐骑技能存档完成!`);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
// 获得管制技能列表
|
|
getList(control: number): SkillBase[] {
|
|
let list: SkillBase[] = [];
|
|
if (control == 0) {
|
|
return list;
|
|
}
|
|
// 1个种族4个坐骑,1个坐骑位3个技能
|
|
let horseIndex = control % 4;
|
|
let start = ((horseIndex == 0 ? 4 : horseIndex) - 1) * 3 + 1;
|
|
for (let i = 0; i < 3; i++) {
|
|
let skill = this.dict[start + i];
|
|
if (skill) {
|
|
list.push(skill);
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
getSkill(position: number): SkillBase {
|
|
let result = this.dict[position];
|
|
return result;
|
|
}
|
|
// 洗炼
|
|
refining(data: any) {
|
|
let operate = data.operate;
|
|
let position = data.horseIndex;
|
|
if (operate == RefiningOperate.REFINING) {
|
|
let itemData = ItemUtil.getItemData(GameUtil.horseRefiningItemId);
|
|
let count = ItemUtil.getBagItemCount(this.owner, itemData.id);
|
|
if (count < 3) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `您需要至少3个[${itemData.name}]才能洗炼坐骑技能!`
|
|
});
|
|
return;
|
|
}
|
|
let group = (position - 1) * 3;
|
|
let right = group + 1 + HorseSkill.skillMax;
|
|
for (let i = 0; i < 3; i++) {
|
|
let skill = SkillUtil.getRandomHorseSkill(group + i);
|
|
if(skill.skill_name.substring(0,2) == "高级"){
|
|
let r = GameUtil.random(0,100)
|
|
if(r >= 20){
|
|
i--;
|
|
continue;
|
|
}
|
|
}
|
|
this.dict[right + i] = skill;
|
|
SKLogger.debug(`玩家[${this.owner.roleid}:${this.owner.name}]坐骑技能洗炼:[${right + i}:${skill.skill_name}]`);
|
|
}
|
|
this.owner.addItem(itemData.id, -3, false, "坐骑洗炼");
|
|
let params = this.toObj();
|
|
if(this.owner){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: this.owner.roleid,
|
|
roleName: this.owner.name,
|
|
operateType: Operate.HORSE,
|
|
operateDepict: "坐骑洗练",
|
|
operateResSerial: position,
|
|
operateResName: this.owner.name,
|
|
operateContent: SKDataUtil.toJson(this.toObj(), "{}")
|
|
})
|
|
}
|
|
this.owner.send("s2c_horse_skill", params);
|
|
} else if (operate == RefiningOperate.REPLACE) {
|
|
if (data.locks) {
|
|
let total = 0;
|
|
for (let lock of data.locks) {
|
|
if (lock == 1) {
|
|
total++;
|
|
}
|
|
}
|
|
if (total > 0) {
|
|
total = SKDataUtil.clamp(total, 1, 2);
|
|
let jade = GameUtil.lockJade[total - 1];
|
|
if (ItemUtil.getBagItemCount(this.owner,20026) < jade) {
|
|
this.owner.send('s2c_notice', {
|
|
strRichText: `您的坐骑炼化锁不足,坐骑洗炼锁住${total}条技能需消耗坐骑炼化锁${jade}`,
|
|
});
|
|
return;
|
|
}
|
|
this.owner.addBagItem(20026, -jade, `坐骑洗炼锁住${total}条技能,消耗坐骑锁:${jade}`);
|
|
// this.owner.addMoney(GameUtil.goldKind.Jade, -jade, `坐骑洗炼锁住${total}条技能,消耗仙玉${jade}`);
|
|
}
|
|
}
|
|
let left = (position - 1) * 3 + 1;
|
|
let right = left + HorseSkill.skillMax;
|
|
for (let i = 0; i < 3; i++) {
|
|
let leftSkill = this.dict[left + i];
|
|
let rightSkill = this.dict[right + i];
|
|
if (rightSkill == null) {
|
|
continue;
|
|
}
|
|
if (data.locks && i < data.locks.length) {
|
|
let lock = data.locks[i];
|
|
if (lock == 1) {
|
|
this.dict[right + i] = null;
|
|
continue;
|
|
}
|
|
}
|
|
rightSkill.exp = leftSkill.exp;
|
|
this.dict[left + i] = rightSkill;
|
|
this.dict[right + i] = null;
|
|
SKLogger.debug(`玩家[${this.owner.roleid}:${this.owner.name}]坐骑技能洗炼替换:[${leftSkill.skill_name}]->[${rightSkill.skill_name}]`);
|
|
}
|
|
let params = this.toObj();
|
|
this.owner.send("s2c_horse_skill", params);
|
|
let control = (this.owner.race - 1) * 4 + position;
|
|
if(this.owner){
|
|
SKCxfUtil.getCxfRecordOperate({
|
|
roleId: this.owner.roleid,
|
|
roleName: this.owner.name,
|
|
operateType: Operate.HORSE,
|
|
operateDepict: "保存坐骑洗练",
|
|
operateResSerial: position,
|
|
operateResName: this.owner.name,
|
|
operateContent: SKDataUtil.toJson(this.toObj(), "{}")
|
|
})
|
|
}
|
|
this.owner.updatePetControl(control);
|
|
}
|
|
}
|
|
|
|
toObj(): any {
|
|
let result = [];
|
|
for (let position in this.dict) {
|
|
let skill: SkillBase = this.dict[position];
|
|
if (skill) {
|
|
let obj = {
|
|
position: SKDataUtil.numberBy(position),
|
|
skillId: SKDataUtil.numberBy(skill.skill_id),
|
|
exp: skill.exp,
|
|
};
|
|
result.push(obj);
|
|
}
|
|
}
|
|
return { list: result };
|
|
}
|
|
} |