xy-server/game/object/Equip.ts

433 lines
16 KiB
TypeScript
Raw Normal View History

2025-04-23 09:34:08 +08:00
import SKDataUtil from "../gear/SKDataUtil";
import SKLogger from "../gear/SKLogger";
import DB from "../utils/DB";
import GameUtil from "../core/GameUtil";
import {EEquipPos, EEquipType, Operate} from "../role/EEnum";
import EquipMgr from "./EquipMgr";
import Player from "./Player";
export default class Equip {
owner: Player;
name: string;
EquipID: string;
EquipType: number;
// 装备评分
BaseScore: number;
BaseAttr: any;
Grade: number;
EIndex: number;
Shuxingxuqiu: any;
Type: any;
GemCnt: any;
LianhuaAttr: any;
pos: any;
state: any;
attr1: any;
gemarr: any;
refine: any = {};
recast: any = {};
constructor(info: any, owner: Player) {
this.owner = owner;
this.name = '';
this.EquipID = info.EquipID;
this.EquipType = 0;
this.BaseAttr = {};
this.Grade = 0;
this.EIndex = 0;
this.Shuxingxuqiu = {};
this.Type = 0;
this.GemCnt = 0;
this.LianhuaAttr = {};
this.pos = EEquipPos.BAG; // 所在位置 1初始 2身上 3背包 4仓库
this.state = 1;
// 属性
this.attr1 = {};
GameUtil.clearAllAttr(this.attr1);
// 行 装备位 0-武器 ... 列 1,2,3,4,5,6,7级宝石
this.gemarr = [
[30025, 30026, 30027, 30028, 30029, 30030, 30104], // 红宝石
[30013, 30014, 30015, 30016, 30017, 30018, 30102], // 绿宝石
[30019, 30020, 30021, 30022, 30023, 30024, 30103], // 蓝宝石
[30001, 30002, 30003, 30004, 30005, 30006, 30100], // 紫宝石
[30007, 30008, 30009, 30010, 30011, 30012, 30101], // 橙宝石
];
this.setDB(info);
}
setDB(info: any) {
if (info == null) {
return;
}
if (info.name) {
this.name = info.name;
} else if (info.EName) {
this.name = info.EName;
}
info.EquipType && (this.EquipType = info.EquipType);
if (info.BaseAttr) {
this.BaseAttr = SKDataUtil.jsonBy(info.BaseAttr);
}
info.Grade && (this.Grade = info.Grade);
info.EIndex && (this.EIndex = info.EIndex);
info.Shuxingxuqiu && (this.Shuxingxuqiu = SKDataUtil.jsonBy(info.Shuxingxuqiu));
info.Type && (this.Type = info.Type);
info.GemCnt && (this.GemCnt = info.GemCnt);
info.LianhuaAttr && (this.LianhuaAttr = SKDataUtil.jsonBy(info.LianhuaAttr));
if (info.refine) {
this.refine = SKDataUtil.toJson(info.refine, "{}");
}
if (info.recast) {
this.refine = SKDataUtil.toJson(info.recast, "{}");
}
info.pos && (this.pos = info.pos);
this.calculateAttribute();
}
getAttr(attrtype: number): number {
return this.attr1[attrtype];
}
canUpgrade(): boolean {
let fulldata: any = this.getFullData();
if (fulldata.EquipType == EEquipType.XinShou) {
} else if (fulldata.EquipType == EEquipType.HIGH) {
if (fulldata.Grade >= 120) {
return false;
}
} else if (fulldata.EquipType > EEquipType.HIGH) {
if (!fulldata.NextType || fulldata.NextType == 0) {
return false;
}
}
return true;
}
checkUpgradeBroke(): boolean {
// 1-2=50%
// 2-3=25%
// 3-4=5%
// 4-5=1%
if (this.Grade > GameUtil.shenBingBroke.length) {
return false;
}
let r = GameUtil.random(0, 10000);
let successpre = GameUtil.shenBingBroke[this.Grade - 1];
if (r < successpre) {
return true;
}
return false;
}
// 升阶
upgrade(data: any): boolean {
let fulldata: any = this.getFullData();
let nextGrade = 0;
let nextType = fulldata.NextType;
let toType = fulldata.EquipType;
if (fulldata.EquipType == 0) {
nextGrade = 2;
toType = 1;
} else if (fulldata.EquipType == 1) {
nextGrade = fulldata.Grade + 1;
toType = 1;
} else if (fulldata.EquipType >= 1) {
if (!fulldata.NextType || fulldata.NextType == 0) {
return false;
}
nextGrade = fulldata.Grade + 1;
}
data.resid = nextType;
let oldGrade = data.grade;
if (oldGrade == null) {
oldGrade = 1;
}
data.grade = nextGrade;
data.type = toType;
data.index = fulldata.EIndex;
let equipData = EquipMgr.shared.getEquipData(data);
this.setDB(equipData);
return true;
}
calculateAttribute() {
GameUtil.clearAllAttr(this.attr1);
if (SKDataUtil.isArray(this.BaseAttr)) {
for (let item of this.BaseAttr) {
for (let key in item) {
let nkey = parseInt(key);
let value = parseInt(item[nkey]);
if (GameUtil.equipTypeNumerical.indexOf(nkey) == -1) {
value = value / 10;
}
value = Math.floor(SKDataUtil.toDecimal2(value * (1 + 0.033 * this.GemCnt)));
this.attr1[key] += value;
break;
}
}
} else {
for (let key in this.BaseAttr) {
if (this.BaseAttr.hasOwnProperty(key)) {
let nkey = parseInt(key);
let value = parseInt(this.BaseAttr[nkey]);
if (GameUtil.equipTypeNumerical.indexOf(nkey) == -1) {
value = value / 10;
}
value = Math.floor(SKDataUtil.toDecimal2(value * (1 + 0.033 * this.GemCnt)));
this.attr1[key] += value;
}
}
}
if (Array.isArray(this.LianhuaAttr)) {
for (let data of this.LianhuaAttr) {
for (let key in data) {
let nkey = parseInt(key);
let value = parseInt(data[nkey]);
if (GameUtil.equipTypeNumerical.indexOf(nkey) == -1) {
value = value / 10;
}
this.attr1[key] += value;
break;
}
}
}
}
getInlayGemID(): any {
let result = this.gemarr[this.EIndex - 1][Math.floor(this.GemCnt / 3)];
return result;
}
getGemList(): any {
let list: any = {};
if (this.GemCnt > 21) {
this.GemCnt = 21;
}
let curGemlevel = Math.floor(this.GemCnt / 3);
for (let index = 0; index < curGemlevel; index++) {
list[this.gemarr[this.EIndex - 1][index]] = 3;
}
let lastNum = this.GemCnt - Math.floor(this.GemCnt / 3) * 3;
if (lastNum > 0) {
list[this.gemarr[this.EIndex - 1][curGemlevel]] = lastNum;
}
return list;
}
getFullData(roleId?: number): any {
let equipdata: any = EquipMgr.shared.getEquipData({resid: this.Type, type: this.EquipType});
if (equipdata == null) {
SKLogger.warn(`装备[${this.EquipID}:${this.name}]完整信息为空!`);
return null;
}
if (SKDataUtil.isEmptyString(equipdata.EName)) {
SKLogger.warn(``);
} else {
this.name = equipdata.EName;
}
let fulldata: any = {};
fulldata.EquipID = this.EquipID;
fulldata.EquipType = this.EquipType;
fulldata.BaseAttr = this.BaseAttr;
fulldata.EDesc = equipdata.EDesc;
fulldata.Detail = equipdata.Detail;
fulldata.Dynamic = equipdata.Dynamic;
fulldata.Grade = this.Grade;
fulldata.EIndex = this.EIndex;
fulldata.JiLv = equipdata.JiLv;
fulldata.MaxEmbedGemCnt = equipdata.MaxEmbedGemCnt;
fulldata.MaxEndure = equipdata.MaxEndure;
fulldata.EName = this.name;
fulldata.NeedGrade = equipdata.NeedGrade;
fulldata.NeedRei = equipdata.NeedRei;
fulldata.NextType = equipdata.NextType;
fulldata.Overlap = equipdata.Overlap;
fulldata.Quan = equipdata.Quan;
fulldata.Race = equipdata.Race;
fulldata.Rarity = equipdata.Rarity;
fulldata.RndRange = equipdata.RndRange;
fulldata.RndWeight = equipdata.RndWeight;
fulldata.Sex = equipdata.Sex;
fulldata.Shape = equipdata.Shape;
fulldata.Shuxingxuqiu = this.Shuxingxuqiu;
fulldata.Type = this.Type;
fulldata.GemCnt = this.GemCnt;
fulldata.LianhuaAttr = this.LianhuaAttr;
fulldata.OwnerRoleId = equipdata.OwnerRoleId;
let score = GameUtil.getEquipScore(this.BaseAttr, this.LianhuaAttr, this.EquipType, this.Grade, equipdata.Sex, equipdata.Race, equipdata.BaseScore, this.getGemList());
this.BaseScore = score;
fulldata.BaseScore = score;
return fulldata;
}
toObj() {
let fulldata = this.getFullData();
let baseAttr: any;
if (SKDataUtil.isArray(this.BaseAttr)) {
baseAttr = this.BaseAttr;
} else {
baseAttr = {};
for (let key in this.BaseAttr) {
let value = this.attr1[key];
baseAttr[key] = value;
let nkey = parseInt(key);
if (GameUtil.equipTypeNumerical.indexOf(nkey) == -1) {
baseAttr[key] *= 10;
}
}
}
let obj: any = {};
obj.EquipID = this.EquipID;
obj.EquipType = this.EquipType;
obj.BaseAttr = SKDataUtil.toJson(baseAttr, "{}");
obj.EDesc = fulldata.EDesc;
obj.Detail = fulldata.Detail;
obj.Dynamic = fulldata.Dynamic;
obj.Grade = this.Grade;
obj.EIndex = this.EIndex;
obj.JiLv = fulldata.JiLv;
obj.MaxEmbedGemCnt = fulldata.MaxEmbedGemCnt;
obj.MaxEndure = fulldata.MaxEndure;
obj.EName = fulldata.EName;
obj.NeedGrade = fulldata.NeedGrade;
obj.NeedRei = fulldata.NeedRei;
obj.NextType = fulldata.NextType;
obj.Overlap = fulldata.Overlap;
obj.Quan = fulldata.Quan;
obj.Race = fulldata.Race;
obj.Rarity = fulldata.Rarity;
obj.RndRange = fulldata.RndRange;
obj.RndWeight = fulldata.RndWeight;
obj.Sex = fulldata.Sex;
obj.Shape = fulldata.Shape;
obj.Shuxingxuqiu = SKDataUtil.toJson(this.Shuxingxuqiu, "{}");
obj.Type = this.Type;
obj.GemCnt = this.GemCnt;
obj.LianhuaAttr = SKDataUtil.toJson(this.LianhuaAttr, "{}");
obj.OwnerRoleId = fulldata.OwnerRoleId;
obj.refine = SKDataUtil.toJson(this.refine, "{}");
obj.recast = SKDataUtil.toJson(this.recast, "{}");
obj.BaseScore = fulldata.BaseScore;
return obj;
}
getSendInfo(): any {
let fullEquipData = this.getFullData();
if (fullEquipData == null) {
SKLogger.warn(`装备[${this.EquipID}:${this.name}]发送信息为空`);
return null;
}
// 判断当前配饰是否需要鉴定0 不需要鉴定 1 需要鉴定)
let flag = 0;
if (fullEquipData.EquipType == EEquipType.BALDRIC && fullEquipData.BaseAttr.length < 1) {
flag = 1;
}
let result = {
EquipID: fullEquipData.EquipID,
Shape: fullEquipData.Shape,
EName: fullEquipData.EName,
EquipType: fullEquipData.EquipType,
EIndex: fullEquipData.EIndex,
Grade: fullEquipData.Grade,
NextType: fullEquipData.NextType,
Type: fullEquipData.Type,
GemCnt: fullEquipData.GemCnt,
flag: flag,
};
return result;
}
save() {
if (this.state == 0) {
DB.delEquip(this.EquipID, this.owner.roleid, (code: number) => {
});
} else {
let savedata: any = {};
savedata.name = this.name;
savedata.EquipType = this.EquipType;
savedata.BaseAttr = SKDataUtil.toJson(this.BaseAttr, "{}");
savedata.Grade = this.Grade;
savedata.EIndex = this.EIndex;
savedata.Shuxingxuqiu = SKDataUtil.toJson(this.Shuxingxuqiu, "{}");
savedata.Type = this.Type;
savedata.GemCnt = this.GemCnt;
savedata.LianhuaAttr = SKDataUtil.toJson(this.LianhuaAttr, "{}");
savedata.refine = SKDataUtil.toJson(this.refine, "{}");
savedata.recast = SKDataUtil.toJson(this.recast, "{}");
savedata.pos = this.pos;
savedata.BaseScore = this.BaseScore;
DB.saveEquipInfo(this.EquipID, this.owner.roleid, savedata, () => {
});
}
}
saveSQL(): string {
if (this.state == 0) {
return `UPDATE qy_equip SET state = 0, delete_time = NOW() WHERE EquipID='${this.EquipID}' AND RoleID='${this.owner.roleid}';`
} else {
let savedata: any = {};
savedata.name = this.name;
savedata.EquipType = this.EquipType;
savedata.BaseAttr = SKDataUtil.toJson(this.BaseAttr, "{}");
savedata.Grade = this.Grade;
savedata.EIndex = this.EIndex;
savedata.Shuxingxuqiu = SKDataUtil.toJson(this.Shuxingxuqiu, "{}");
savedata.Type = this.Type;
savedata.GemCnt = this.GemCnt;
savedata.LianhuaAttr = SKDataUtil.toJson(this.LianhuaAttr, "{}");
savedata.refine = SKDataUtil.toJson(this.refine, "{}");
savedata.recast = SKDataUtil.toJson(this.recast, "{}");
savedata.pos = this.pos;
//防止装备无评分报错
if (this.BaseScore == undefined) {
let score = 0;
let equipdata: any = EquipMgr.shared.getEquipData({resid: this.Type, type: this.EquipType});
if (equipdata != null && equipdata != undefined) {
score = GameUtil.getEquipScore(this.BaseAttr, this.LianhuaAttr, this.EquipType, this.Grade, equipdata.Sex, equipdata.Race, equipdata.BaseScore, this.getGemList());
}
this.BaseScore = score;
}
savedata.BaseScore = this.BaseScore;
let numlist = ['pos', 'Grade', 'Type', 'GemCnt', 'EIndex', 'BaseScore'];
let updatestr = '';
for (const key in savedata) {
if (numlist.indexOf(key) == -1) {
updatestr += `${key} = '${savedata[key]}', `
} else {
updatestr += `${key} = ${savedata[key]}, `
}
}
updatestr = updatestr.substr(0, updatestr.length - 2);
let sql = `UPDATE qy_equip SET ${updatestr} WHERE EquipID = '${this.EquipID}' AND RoleID='${this.owner.roleid}';`;
return sql;
}
}
cxfEquip(RoleID: any) {
let savedata: any = {};
savedata.equipID = this.EquipID;
savedata.equipType = this.EquipType;
savedata.roleID = RoleID;
savedata.baseAttr = SKDataUtil.toJson(this.BaseAttr, "{}");
savedata.grade = this.Grade;
savedata.eIndex = this.EIndex;
savedata.shuxingxuqiu = SKDataUtil.toJson(this.Shuxingxuqiu, "{}");
savedata.type = this.Type;
savedata.gemCnt = this.GemCnt;
savedata.lianhuaAttr = SKDataUtil.toJson(this.LianhuaAttr, "{}");
savedata.refine = SKDataUtil.toJson(this.refine, "{}");
savedata.recast = SKDataUtil.toJson(this.recast, "{}");
savedata.pos = this.pos;
savedata.name = this.name;
//防止装备无评分报错
if (this.BaseScore == undefined) {
let equipdata: any = EquipMgr.shared.getEquipData({resid: this.Type, type: this.EquipType});
let score = GameUtil.getEquipScore(this.BaseAttr, this.LianhuaAttr, this.EquipType, this.Grade, equipdata.Sex, equipdata.Race, equipdata.BaseScore, this.getGemList());
this.BaseScore = score;
}
savedata.baseScore = this.BaseScore;
return savedata;
}
}