2025-04-24 17:03:28 +08:00

1457 lines
51 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 道具工具類
*/
import Lottery from "../bag/Lottery";
import RecastPanel from "../game/baldric/RecastPanel";
import MsgAlert from "../game/msg/MsgAlert";
import SkillBase, { ESkillQuality, ESkillType } from "../game/skill/core/SkillBase";
import SkillUtil from "../game/skill/core/SkillUtil";
import FGAlert from "../gear_2.3.4/fgui/FGAlert";
import FGUtil, { TipAlign } from "../gear_2.3.4/fgui/FGUtil";
import Report from "../gear_2.3.4/net/Report";
import SKDataUtil from "../gear_2.3.4/util/SKDataUtil";
import SKLogger from "../gear_2.3.4/util/SKLogger";
import SKUIUtil from "../gear_2.3.4/util/SKUIUtil";
import { EEquipIndex, EItemMenu } from "./EEnum";
import GameModel from "./GameModel";
import GameUtil from "./GameUtil";
import SafeCheckAlert from "./SafeCheckAlert";
import PopupManager from "../gear_2.3.4/manager/PopupManager";
import Transformation from "../transformation/Transformation";
import HorsePanel from "../horse/HorsePanel";
import PubFunction = require('../../game/PubFunction');
import Bag from "../bag/Bag";
export default class ItemUtil {
// 圖標圖集
static itemAtlas0: cc.SpriteAtlas;
static itemAtlas1: cc.SpriteAtlas;
// 預製體
static workShopPrefab: cc.Prefab;
// 使用道具
static useItemsAlert: fgui.GComponent;
static mask: fgui.GObject;
static clickUseItemBlock: (data: any) => void;
// 道具詳情
static itemDetailAlert: fgui.GComponent;
static showMenu: boolean = true;
static itemData: any;
// 套裝技能
static suitDetailAlert: fgui.GComponent;
static suitId: number = 0;
static suitSkillId: ESkillType = ESkillType.NONE;
static menu = [
EItemMenu.EQUIP, EItemMenu.RECAST, EItemMenu.RESOLVE
];
static sexName = ["男", "女"];
static raceName = ['人', '仙', '魔', '鬼', '龍'];
static launch() {
let url = `Prefabs/WorkShopPanel`;
cc.loader.loadRes(url, cc.Prefab, (error, prefab) => {
if (error) {
SKLogger.warn(`$警告:加載資源${url}錯誤!`);
return;
}
ItemUtil.workShopPrefab = prefab;
});
let url2 = `Prefabs/WorkShopPanel`;
cc.loader.loadRes(url2, cc.Prefab, (error, prefab) => {
if (error) {
SKLogger.warn(`$警告:加載資源${url}錯誤!`);
return;
}
ItemUtil.workShopPrefab = prefab;
});
let url3 = `Prefabs/WorkShopPanel`;
cc.loader.loadRes(url3, cc.Prefab, (error, prefab) => {
if (error) {
SKLogger.warn(`$警告:加載資源${url}錯誤!`);
return;
}
ItemUtil.workShopPrefab = prefab;
});
}
// 獲得道具圖標
static getItemIconBy(value: any): cc.SpriteFrame {
let result: cc.SpriteFrame = null;
// 是否有json配置
if (value.json && value.json.length > 0) {
try {
let json = JSON.parse(value.json);
// 是否為寶寶
if (json.petid) {
let item = GameModel.conf_pet[json.petid];
if (item) {
result = ItemUtil.getItemIcon(item.resid);
if (result) {
return result;
}
}
}
} catch (error) {
}
}
if (value.icon) {
result = this.getItemIcon(value.icon);
} else if (value.Shape) {
let data = this.getItemData(value.Shape);
if (data == null) {
result = this.getItemIcon(value.Shape);
} else {
result = this.getItemIcon(data.icon);
}
}
return result;
}
// 獲得道具定義
static getItemName(itemId: any): string {
let result = this.getItemData(itemId);
if (result) {
return result.name;
}
SKLogger.warn(`$警告:找不到道具名稱定義:${itemId}`);
return "";
}
// 獲得道具定義
static getItemData(itemId: any): any {
let conf = GameModel.game_conf;
if (!conf) {
return null;
}
let items = conf.item;
if (!items) {
return null;
}
let result = items[itemId];
if (!result) {
return null;
}
return result;
}
// 獲得背包道具數量
static getBagItemCount(itemId: number): number {
let bagList: any = GameModel.player.itemList;
if (!bagList) {
return 0;
}
let result = bagList[itemId];
if (!result) {
return 0;
}
return result;
}
// 獲得使用道具顏色,不足時為紅色否則為白色
static getUseItemColor(count: number): cc.Color {
let result = SKUIUtil.colorOfString(count < 1 ? "#F90201" : "#FFFFFF");
return result;
}
// 獲得FGUI圖標定義
static getFGuiIcon(value: any): string {
let result: string = "";
// 是否有json配置
if (value.json && value.json.length > 0) {
try {
let json = JSON.parse(value.json);
// 是否為寶寶
if (json.petid) {
let item = GameModel.conf_pet[json.petid];
if (item) {
result = item.resid;
return result;
}
}
} catch (error) {
}
}
if (value.icon) {
result = value.icon;
} else if (value.Shape) {
result = value.Shape;
}
return result;
}
// 獲得道具圖標
static getItemIcon(iconId: string): cc.SpriteFrame {
let item = fgui.UIPackage.getItemByURL(`ui://main_ui/${iconId}`);
if (item == null) {
SKLogger.warn(`找不到圖標項目:${iconId}`);
return null;
}
item.load();
let asset: cc.SpriteFrame = <cc.SpriteFrame>item.asset;
if (asset == null) {
SKLogger.warn(`找不到圖標資源:${iconId}`);
}
return asset;
}
// 能否合成
static canSynthesis(itemId: number): Boolean {
// 如果配置不存在則返回不能合成
if (!GameModel.game_conf) {
return false;
}
let list = GameModel.game_conf.synthesis;
for (let key in list) {
let item = list[key];
// 如果是合成物品則能合成
if (itemId == item.id) {
return true;
}
// 如果在合成列表中能合成
if (item.list.indexOf(itemId) != -1) {
return true;
}
}
return false;
}
// 能否分解
static canResolve(data: any): number {
if (SKDataUtil.atRange(data.id, [20011, 20012, 20013, 20014, 20015])) {
return 5;
}
if (SKDataUtil.atRange(data.id, [21011, 21012, 21013, 21014, 21015])) {
return 10;
}
return 0;
}
// 獲得合成表
static synthesisMap(): any {
let result: any = GameModel.game_conf;
if (result == null) {
return {};
}
result = result.synthesis;
if (result == null) {
return {};
}
return result;
}
// 獲得合成表
static getSynthesisItem(index: number): string {
let result: any = GameModel.game_conf;
if (result == null) {
return "";
}
result = result.synthesis;
if (result == null) {
return "";
}
result = result[index];
if (result == null) {
return "";
}
result = result.map;
return result;
}
// 是否為召喚獸使用
static isPetUse(value: number): boolean {
if (value >= 10110 && value <= 10114) {
return true;
}
if (value >= 10116 && value <= 10118) {
return true;
}
if (value >= 10501 && value <= 10589) {
return true;
}
if (value >= 20001 && value <= 20005) {
return true;
}
if (value >= 20006 && value <= 21015) {
return true;
}
return false;
}
static useItem(itemId: number, count: number = 1, operateid: number = 0) {
let itemData = this.getItemData(itemId);
if (itemData.id >= 30001 && itemData.id <= 30030) {
let workshop = cc.instantiate(this.workShopPrefab);
workshop.parent = cc.find('Canvas');
workshop.getComponent('WorkShopPanel').setCurPanel(3);
let bagLayer = cc.find('Canvas/MainUI/BagPanel');
if (bagLayer != null) {
bagLayer.destroy();
}
return;
}
if (itemData == null || (itemData.count <= 0 && itemData.effect == 1)) {
return;
}
if (itemId == 50023) {
Lottery.shared.show(itemId);
return;
}
if (itemId == 50004) {
Lottery.shared.loadNewTreasure()
}
if (SKDataUtil.atRange(itemId, [50001, 50002, 50003])) //藏寶圖類型
{
let json = SKDataUtil.jsonBy(itemData.json);
GameUtil.myPlayerToDo(json.map, json.x, json.y, () => {
GameUtil.createWaitTip('挖寶', 1, () => {
GameModel.send('c2s_use_bagitem', {
roleid: Report.roleId,
itemid: itemId,
count: count,
operateid: operateid
});
});
});
return;
}
let params = {
roleid: Report.roleId,
itemid: itemId,
count: count,
operateid: operateid
};
GameModel.send('c2s_use_bagitem', params);
}
static useItems(target: fgui.GObject, itemList: number[], clickBlock: (data: any) => void) {
if (this.useItemsAlert != null) {
if (SKUIUtil.isValid(this.useItemsAlert.node)) {
this.clickMask(null);
} else {
this.useItemsAlert = null;
}
}
if (this.useItemsAlert == null) {
this.useItemsAlert = fgui.UIPackage.createObject("main_ui", "use_items").asCom;
let list = FGUtil.getList(this.useItemsAlert, "list");
list.removeChildrenToPool();
for (let itemId of itemList) {
let item = ItemUtil.getItemData(itemId);
let cell = list.addItemFromPool().asCom;
cell.getChild("title").asTextField.text = item.name;
cell.getChild("desc").asTextField.text = item.typedetail;
let count = ItemUtil.getBagItemCount(itemId);
item.count = count;
let count_tf = cell.getChild("count").asTextField;
count_tf.text = `${count}`;
let color = ItemUtil.getUseItemColor(count);
count_tf.color = color;
cell.icon = `ui://main_ui/${item.icon}`;
cell.data = item;
}
list.resizeToFit();
this.useItemsAlert.height = list.height;
FGUtil.align(target, this.useItemsAlert, TipAlign.TOP_RIGHT);
this.mask = fgui.UIPackage.createObject("main_ui", "alpha_mask").asCom;
this.mask.onClick(this.clickMask, this);
this.clickUseItemBlock = clickBlock;
list.on(fgui.Event.CLICK_ITEM, this.clickUseItem, this);
FGUtil.root().addChild(this.mask);
this.mask.makeFullScreen();
FGUtil.root().addChild(this.useItemsAlert);
}
}
static clickUseItem(item: fgui.GObject, clickBlock: (data: any) => void) {
let data = item.data;
if (this.clickUseItemBlock) {
this.clickUseItemBlock(data);
}
}
static clickMask(even: fgui.Event) {
if (this.useItemsAlert) {
this.mask.dispose();
this.useItemsAlert.dispose();
this.mask = null;
this.useItemsAlert = null;
this.clickUseItemBlock = null;
}
}
static resetUseItemsCount() {
if (this.useItemsAlert) {
let list = FGUtil.getList(this.useItemsAlert, "list");
for (let i = 0; i < list.numItems; i++) {
let cell: fgui.GComponent = <fgui.GComponent>list.getChildAt(i);
let data = cell.data;
let count = ItemUtil.getBagItemCount(data.id);
let count_tf = cell.getChild("count").asTextField;
count_tf.text = `${count}`;
let color = ItemUtil.getUseItemColor(count);
count_tf.color = color;
}
}
}
// 是否為佩飾
static isBaldric(index: number): boolean {
if (SKDataUtil.atRange(index, [EEquipIndex.CAPE, EEquipIndex.PENDANT, EEquipIndex.BELT, EEquipIndex.RING_LEFT, EEquipIndex.RING_RIGHT])) {
return true;
}
return false;
}
static isShowDetail(): boolean {
if (this.itemData == null) {
return false;
}
return true;
}
// 顯示物品詳情
static showItemDetail(itemId: any, count: number = 0) {
let itemData = ItemUtil.getItemData(itemId);
if (itemData == null) {
SKLogger.warn(`找不到道具定義`);
return;
}
if (this.itemDetailAlert) {
FGUtil.dispose(this.itemDetailAlert);
}
this.itemDetailAlert = fgui.UIPackage.createObject("main_ui", "item_detail_panel").asCom;
FGUtil.root().addChild(this.itemDetailAlert);
let mask = FGUtil.getComponent(this.itemDetailAlert, "mask");
mask.onClick(this.closeItemDetail, this);
var typearr = ['物品', '五行天書', '材料', '藥品', '經驗', '銀兩', '仙玉', '神兵', '仙器', '召喚獸', '技能書', '綁定仙玉', '元氣丹', '寶箱', `鑰匙`, `變身卡`];
FGUtil.getTextField(this.itemDetailAlert, "group/alert/type").text = typearr[itemData.type];
// 圖示
let iconLoader = FGUtil.getLoader(this.itemDetailAlert, "group/alert/item/icon");
iconLoader.url = `ui://main_ui/${itemData.icon}`;
// 名稱
let itemName = FGUtil.getTextField(this.itemDetailAlert, "group/alert/name_tf");
itemName.text = itemData.name;
// 描述
let desc = FGUtil.getRichTextField(this.itemDetailAlert, "group/alert/desc_group/desc");
let info = itemData.description;
desc.text = `${itemData.description}\n【用途】${info.usedetail}`;
// 刪除按鈕
let remove_btn = FGUtil.getButton(this.itemDetailAlert, "group/alert/remove_btn");
remove_btn.node["itemId"] = itemData.id;
remove_btn.node["itemCount"] = count;
remove_btn.node["itemName"] = itemData.name;
remove_btn.onClick(this.removeItem, this);
// 操作按鈕部分
let menuList = FGUtil.getList(this.itemDetailAlert, "group/menu/list");
menuList.removeChildrenToPool();
let index = 0;
this.menu = [];
// 使用
this.menu.push(EItemMenu.USE);
// 能否合成
if (ItemUtil.canSynthesis(itemData.id))
this.menu.push(EItemMenu.COMPOSE);
// 能否分解
if (ItemUtil.canResolve(itemData) > 0)
this.menu.push(EItemMenu.RESOLVE);
for (let type of this.menu) {
let title = this.getMenu(type);
if (SKDataUtil.isEmptyString(title)) {
continue;
}
let cell = menuList.addItemFromPool().asButton;
cell.title = this.getMenu(type);
var data = {
type: type,
itemId: itemData.id,
count: count
}
cell.data = data;
index++;
}
menuList.height = 50 * index + 10;
menuList.on(fgui.Event.CLICK_ITEM, this.onClickItemMenu, this);
}
// 顯示配飾詳情
static showAccessDetail(data: any, isUse: boolean = false, isOpe: boolean = true) {
let itemData = ItemUtil.getItemData(data.Type);
if (itemData == null) {
SKLogger.warn(`找不到道具定義`);
return;
}
this.itemData = data;
if (this.itemData.BaseAttr == null) {
let params = {
roleid: GameModel.player.roleid,
equipid: data.EquipID
}
GameModel.send('c2s_equip_info', params);
return;
}
var needAppraisal = data.BaseAttr == "[]";
if (this.itemDetailAlert) {
FGUtil.dispose(this.itemDetailAlert);
}
this.itemDetailAlert = fgui.UIPackage.createObject("main_ui", "access_detail_panel").asCom;
FGUtil.root().addChild(this.itemDetailAlert);
let mask = FGUtil.getComponent(this.itemDetailAlert, "mask");
mask.onClick(this.closeItemDetail, this);
let iconLoader = FGUtil.getLoader(this.itemDetailAlert, "group/alert/item/icon");
iconLoader.url = `ui://main_ui/${itemData.icon}`;
let itemName = FGUtil.getTextField(this.itemDetailAlert, "group/alert/name_tf");
itemName.text = (needAppraisal ? "待鑑定的" : "") + itemData.name;
let titleBar = FGUtil.getControl(this.itemDetailAlert, "group/alert/title_bar");
if (titleBar) {
titleBar.selectedIndex = needAppraisal ? 3 : data.Grade - 1;
}
if (!needAppraisal) {
FGUtil.getControl(this.itemDetailAlert, "group/alert/grade4").selectedIndex = data.Grade >= 3 ? 1 : 0;
}
let desc = FGUtil.getRichTextField(this.itemDetailAlert, "group/alert/desc_group/desc");
let info = needAppraisal ? "" : itemData.description;
info = this.addLine(info, needAppraisal ? '【配飾品階】? ' : `【配飾品階】${ItemUtil.getGrade(data.Grade)}`);
info = this.addLine(info, ItemUtil.getIndex(data.EIndex));
if (!needAppraisal) {
info = this.addLine(info, ItemUtil.getUse(data));
info = this.addLine(info, ItemUtil.getLevel(data));
info = this.addLine(info, ItemUtil.getBase(data));
info = this.addLine(info, ItemUtil.getEndure(data));
info = this.addLine(info, ItemUtil.getCan(data));
} else {
info = this.addLine(info, "[color=#CFCE8A]待鑑定 [/color]");
info = this.addLine(info, "[color=#CFCE8A]待鑑定 [/color]");
info = this.addLine(info, "[color=#CFCE8A]待鑑定 [/color]");
info = this.addLine(info, "[color=#CFCE8A]待鑑定 [/color]");
info = this.addLine(info, "[color=#FF0000]該物品無法裝備,請先鑑定[/color]\n");
}
desc.text = info;
let list = FGUtil.getList(this.itemDetailAlert, "group/alert/desc_group/attr");
list.removeChildrenToPool();
let baseAttr = SKDataUtil.jsonBy(data.BaseAttr);
if (baseAttr) {
if (SKDataUtil.isArray(baseAttr)) {
for (let item of baseAttr) {
for (let key in item) {
let value = SKDataUtil.toNumber(item[key]);
let type = SKDataUtil.toNumber(key);
let cell = list.addItemFromPool().asCom;
FGUtil.getTextField(cell, "title").text = GameUtil.getAttrTypeL1Name(type);
let text = ``;
if (GameUtil.equipTypeNumerical.indexOf(type) == -1) {
text = `${value > 0 ? "+" : ""}${SKDataUtil.toDecimal1(value / 10)}%`;
} else {
text = `${value > 0 ? "+" : ""}${SKDataUtil.toDecimal1(value)}`;
}
FGUtil.getTextField(cell, "value").text = text;
break;
}
}
} else {
for (let key in baseAttr) {
let type = SKDataUtil.toNumber(key);
let cell = list.addItemFromPool().asCom;
FGUtil.getTextField(cell, "title").text = GameUtil.getAttrTypeL1Name(type);
let value = SKDataUtil.toNumber(baseAttr[key]);
let text = ``;
if (GameUtil.equipTypeNumerical.indexOf(type) == -1) {
text = `${value > 0 ? "+" : ""}${SKDataUtil.toDecimal1(value / 10)}%`;
} else {
text = `${value > 0 ? "+" : ""}${SKDataUtil.toDecimal1(value)}`;
}
FGUtil.getTextField(cell, "value").text = text;
}
}
list.resizeToFit();
list.visible = true;
} else {
list.visible = false;
}
this.itemDetailAlert.makeFullScreen();
// 套裝技能
let desc_tail = FGUtil.getRichTextField(this.itemDetailAlert, "group/alert/desc_group/desc_tail");
desc_tail.text = ItemUtil.getSuitSkill(data);
desc_tail.onClick(this.clickSuitSkill, this);
desc_tail.visible = !needAppraisal;
let flag = FGUtil.getImage(this.itemDetailAlert, "group/alert/equip_flag");
let remove_btn = FGUtil.getButton(this.itemDetailAlert, "group/alert/remove_btn")
// 是否已裝備
if (this.isEquip(data)) {
flag.visible = true;
remove_btn.visible = false;
} else {
flag.visible = false;
remove_btn.visible = true;
}
if (!isOpe) {
remove_btn.visible = false;
}
// 裝備分數
FGUtil.getTextField(this.itemDetailAlert, "group/alert/score").text = needAppraisal ? "???" : data.BaseScore;
remove_btn.onClick(this.removeAccess, this);
FGUtil.getComponent(this.itemDetailAlert, "group/menu").visible = this.showMenu;
// if (!this.showMenu) {
// console.log(FGUtil.getObject(this.itemDetailAlert, "group").x)
// FGUtil.getObject(this.itemDetailAlert, "group").x=75;
// }
let desc_belong = FGUtil.getRichTextField(this.itemDetailAlert, "group/alert/desc_group/desc_belong");
if (data.name) {
desc_belong.text = `擁有者:${data.name}(${data.roleid})`;
desc_belong.visible = true;
} else {
desc_belong.visible = true;
}
// 操作按鈕部分
let menuList = FGUtil.getList(this.itemDetailAlert, "group/menu/list");
menuList.removeChildrenToPool();
let index = 0;
if (needAppraisal) {
this.menu = [
// EItemMenu.APPRAISAL, EItemMenu.RESOLVE, EItemMenu.RESOLVEAll
EItemMenu.APPRAISAL, EItemMenu.RESOLVE
];
} else {
this.menu = [
EItemMenu.EQUIP, EItemMenu.RECAST, EItemMenu.RESOLVE
];
}
for (let type of this.menu) {
let title = this.getMenu(type);
if (SKDataUtil.isEmptyString(title)) {
continue;
}
let cell = menuList.addItemFromPool().asButton;
cell.title = this.getMenu(type);
cell.data = type;
index++;
}
menuList.height = 50 * index + 10;
menuList.on(fgui.Event.CLICK_ITEM, this.onClickMenu, this);
}
static clickSuitSkill() {
let itemData: any = ItemUtil.getItemData(this.itemData.Type);
if (itemData == null) {
return;
}
let suitId = itemData.level;
this.showSuitSkill(suitId);
}
static showSuitSkill(suitId: number) {
FGUtil.dispose(this.suitDetailAlert);
this.suitDetailAlert = fgui.UIPackage.createObject("main_ui", "suit_skill_main").asCom;
FGUtil.root().addChild(this.suitDetailAlert);
let mask = FGUtil.getComponent(this.suitDetailAlert, "mask");
mask.onClick(this.closeSuitDetail, this);
let suitData = ItemUtil.getSuitData(suitId);
FGUtil.getTextField(this.suitDetailAlert, "alert/group/name_tf").text = suitData.name;
let index = 1;
for (let itemId of suitData.list) {
let key = `alert/group/equip_group/item_${index}`;
let item = FGUtil.getButton(this.suitDetailAlert, key);
let itemData = ItemUtil.getItemData(itemId);
if (itemData != null) {
item.icon = `ui://main_ui/${itemData.icon}`;
} else {
item.icon = `ui://main_ui/1000`;
}
item.getController("suit_grade").selectedIndex = suitData.grade;
index++;
}
let skills = this.getSuitSkillGroup(suitData.group);
let info = ``;
index = 0;
for (let skill of skills) {
info += `${index > 0 ? `\n` : ``}[img]ui://main_ui/${skill.icon}[/img]`;
info += ` [color=${this.getSuitSkillColor(skill)}]${skill.name}`;
info += `${this.suitSkillId == skill.id ? `[color=#ffff00] 已激活[/color][/color]` : ` (需全套${this.getSkillGrade(skill)}以上激活)[/color]`}`;
info += `\n${skill.getSuitDesc()}`;
index++;
}
FGUtil.getRichTextField(this.suitDetailAlert, "alert/group/desc").text = info;
this.suitDetailAlert.makeFullScreen();
}
static getSkillGrade(skill: SkillBase): string {
if (skill.quality == ESkillQuality.HIGH) {
return "珍藏";
} else if (skill.quality == ESkillQuality.FINAL) {
return "無價"
}
return "把玩";
}
// 獲得佩飾顏色
static getBaldricColor(item: any): string {
if (item.BaseAttr != "[]") {
if (item.Grade == 1) {
return "#60d566";
} else if (item.Grade == 2) {
return "#5fd5d6";
} else if (item.Grade == 3) {
return "#b94bd1";
}
}
return "#ff0000";
}
// 獲得佩飾顏色
static getBaldricScore(item: any): number {
if (item.BaseAttr != "[]") {
if (item.Grade == 1) {
return 1;
} else if (item.Grade == 2) {
return 2;
} else if (item.Grade == 3) {
return 5;
}
}
return 1;
}
static getSuitSkillColor(skill: SkillBase): string {
if (skill.quality == ESkillQuality.LOW) {
return "#60d566";
} else if (skill.quality == ESkillQuality.HIGH) {
return "#5fd5d6";
} else if (skill.quality == ESkillQuality.FINAL) {
return "#b94bd1";
}
return "#ff0000";
}
static getSuitSkillUnActiveColor(skill: SkillBase): string {
if (skill.quality == ESkillQuality.LOW) {
return "#39803d";
} else if (skill.quality == ESkillQuality.HIGH) {
return "#388080";
} else if (skill.quality == ESkillQuality.FINAL) {
return "#712e80";
}
return "#ff0000";
}
static getSuitData(suitId: number): any {
let conf = GameModel.game_conf.baldric_suit;
let data = conf[suitId];
return data;
}
static getSuitSkillGroup(group: number): SkillBase[] {
let result = [];
let conf = GameModel.game_conf.baldric_suit;
for (let key in conf) {
let data = conf[key];
if (data.group == group) {
let skill = SkillUtil.getSkill(data.skill);
if (skill) {
result.push(skill);
}
}
}
return result;
}
// 道具分解
static itemResolve(data: any) {
let count = this.canResolve(data);
// FGAlert.show(`確定將道具[color=#b94bd1][${data.name}][/color]分解為${count}點功績?`, () => {
// FGAlert.hide();
// }, () => {
// FGAlert.hide();
let params = {
roleId: GameModel.player.roleid,
itemId: data.id,
count: ItemUtil.getBagItemCount(data.id)
}
GameModel.send("c2s_item_resolve", params);
// });
}
// 裝備分解
static equipResolve(data: any) {
if (data.EIndex == 6) {
FGAlert.show(`確定將翅膀[color=${this.getEquipColor(data)}][${data.EDesc}${data.EName}][/color]分解為10個[img]ui://main_ui/10411[/img]翅膀精華?`, () => {
FGAlert.hide();
}, () => {
FGAlert.hide();
let params = {
roleid: GameModel.player.roleid,
equipid: data.EquipID,
}
GameModel.send("c2s_equip_resolve", params);
});
} else {
FGAlert.show(`確定將仙器[color=${this.getEquipColor(data)}][${data.EDesc}${data.EName}][/color]分解為${this.getEquipResolve(data.Grade)}個[img]ui://main_ui/10406[/img]八荒遺風?`, () => {
FGAlert.hide();
}, () => {
FGAlert.hide();
let params = {
roleid: GameModel.player.roleid,
equipid: data.EquipID,
}
GameModel.send("c2s_equip_resolve", params);
});
}
}
static getEquipColor(data: any): string {
if (data.Grade == 1) {
return "#60d566";
} else if (data.Grade == 2) {
return "#5fd5d6";
} else if (data.Grade == 3) {
return "#b94bd1";
}
return "#ff0000";
}
// 二階仙器分解為50個八荒,三階分解為80四階160五階320
private static getEquipResolve(grade: number): number {
if (grade == 2) {
return 50;
}
if (grade == 3) {
return 80;
}
if (grade == 4) {
return 160;
}
if (grade == 5) {
return 320;
}
return 50;
}
static removeItem() {
let logic = GameModel.player.getMainUILogic();
if (logic && logic.isBattle) {
MsgAlert.addMsg('戰鬥中無法丟棄裝備');
return;
}
if (this.itemData == null) {
SKLogger.warn(`$警告:刪除裝備無效`);
return;
}
let self = this;
FGAlert.show(`是否刪除裝備?`, () => {
FGAlert.hide();
}, () => {
let safeLock = (GameModel.player.safe_lock == 1);
if (safeLock) {
SafeCheckAlert.show(() => {
SafeCheckAlert.hide();
}, () => {
if (self.itemData) {
GameModel.send('c2s_equip_update', {
operation: 0,
roleid: Report.roleId,
equipid: self.itemData.EquipID
});
SafeCheckAlert.hide();
FGAlert.hide();
self.closeItemDetail();
}
})
return;
}
GameModel.send('c2s_equip_update', {
operation: 0,
roleid: GameModel.player.roleid,
equipid: self.itemData.EquipID
});
FGAlert.hide();
self.closeItemDetail();
});
}
static removeAccess() {
let logic = GameModel.player.getMainUILogic();
if (logic && logic.isBattle) {
MsgAlert.addMsg('戰鬥中無法丟棄裝備');
return;
}
if (this.itemData == null) {
SKLogger.warn(`$警告:刪除裝備無效`);
return;
}
let self = this;
FGAlert.show(`是否刪除裝備?`, () => {
FGAlert.hide();
}, () => {
let safeLock = (GameModel.player.safe_lock == 1);
if (safeLock) {
SafeCheckAlert.show(() => {
SafeCheckAlert.hide();
}, () => {
if (self.itemData) {
GameModel.send('c2s_equip_update', {
operation: 0,
roleid: Report.roleId,
equipid: self.itemData.EquipID
});
SafeCheckAlert.hide();
FGAlert.hide();
self.closeItemDetail();
}
})
return;
}
GameModel.send('c2s_equip_update', {
operation: 0,
roleid: GameModel.player.roleid,
equipid: self.itemData.EquipID
});
FGAlert.hide();
self.closeItemDetail();
});
}
static getMenu(type: EItemMenu): string {
if (type == EItemMenu.EQUIP) {
if (this.isEquip(this.itemData)) {
return "卸下";
} else {
return "裝備";
}
} else if (type == EItemMenu.RECAST) {
return "重鑄"
} else if (type == EItemMenu.RESOLVE) {
if (this.isEquip(this.itemData)) {
return "";
}
return "分解"
} else if (type == EItemMenu.RESOLVEAll) {
if (this.isEquip(this.itemData)) {
return "";
}
return "一鍵分解"
} else if (type == EItemMenu.APPRAISAL) {
return "鑑定";
} else if (type == EItemMenu.COMPOSE) {
return "合成";
}
return "使用";
}
static onClickItemMenu(item: fgui.GObject) {
/*
let type: EItemMenu = item.data.type;
var itemId = item.data.itemId
if (type == EItemMenu.USE) {
let canuse = true;
if (ItemUtil.isPetUse(itemId)) { // 親密丹,靈獸丹,聖獸丹,神獸丹,凝魂丹,龍之骨,金柳露
let petpanel = cc.instantiate(this.PetsPanel);
petpanel.name = 'PetPanel';
petpanel.parent = cc.find('Canvas/MainUI');
canuse = false;
}
else if (itemId == 10401) {//悔夢石
let workshop = cc.instantiate(this.WorkShopPanel);
workshop.parent = cc.find('Canvas');
workshop.getComponent('WorkShopPanel').setCurPanel(4);
canuse = false;
}
else if (itemId == 10201) {//回夢丹
PubFunction.CreateSubNode(cc.find('Canvas/MainUI'), { nX: 0, nY: 0 }, this.RestoryUI, 'RestoryUI');
canuse = false;
}
else if (itemId >= 10402 && itemId <= 10404) {
let workshop = cc.instantiate(this.WorkShopPanel);
workshop.parent = cc.find('Canvas');
workshop.getComponent('WorkShopPanel').setCurPanel(2);
canuse = false;
}
else if (itemId == 10405) {//盤古精鐵
let workshop = cc.instantiate(this.WorkShopPanel);
workshop.parent = cc.find('Canvas');
canuse = false;
}
else if (itemId == 10406) {//八荒遺風
let xianqi = cc.instantiate(this.XianQiUpPanel);
xianqi.parent = cc.find('Canvas');
canuse = false;
}
else if (itemId == 10408) {//神兵碎片
let shenbing = cc.instantiate(this.ShenBingCombinePanel);
shenbing.parent = cc.find('Canvas');
canuse = false;
}
else if (itemId >= 20001 && itemId <= 20015) {//五行材料,合成召喚獸
let hecheng = cc.instantiate(this.PetHeChengPanel);
hecheng.parent = cc.find('Canvas');
canuse = false;
}
else if (itemId == 10202 || itemId == 10204) {//夥伴修煉冊
PubFunction.CreateSubNode(cc.find('Canvas/MainUI'), { nX: 0, nY: 0 }, this.PartnerUI, 'PartnerUI');
canuse = false;
}
else if (itemId == 10205) { // 世界鈴鐺廣播
let myLevel = GameModel.player.level;
let itemLevel = this.iteminfo.level;
if (myLevel < itemLevel) {
MsgAlert.addMsg(`${this.iteminfo.name}需要${this.iteminfo.level}級才能使用`);
return;
}
let notice_edit_node = cc.instantiate(this.NoticeEditUI);
notice_edit_node.parent = cc.find('Canvas');
canuse = false;
}
else if (itemId >= 10501 && itemId <= 10583) { //元氣丹
let petpanel = cc.instantiate(this.PetsPanel);
petpanel.name = 'PetPanel';
petpanel.parent = cc.find('Canvas/MainUI');
canuse = false;
}
// 使用坐骑修炼丹,则打开坐骑面板,关闭背包
else if (SKDataUtil.atRange(itemId, [10605, 10606, 10607, 10608])) {
HorsePanel.shared.show();
canuse = false;
}
// 使用变身卡
else if (ItemUtil.isComposeTransformation(itemId)) {
Transformation.Instance.openComposePanel(ItemUtil.getBagItemCount(itemId), itemId)
return;
}
if (!canuse) {
let bagLayer = cc.find('Canvas/MainUI/BagPanel');
if (bagLayer != null) {
bagLayer.destroy();
}
return;
}
ItemUtil.useItem(itemId);
}
*/
}
static isComposeTransformation(id) {
if (SKDataUtil.atRange(id, [100311, 100313, 100315, 100317])) {
return true;
}
return false;
}
static onClickMenu(item: fgui.GObject) {
let type: EItemMenu = item.data;
if (type == EItemMenu.EQUIP) {
if (this.isEquip(this.itemData)) {
this.unload();
} else {
this.equip();
}
} else if (type == EItemMenu.RECAST) {
let itemData = ItemUtil.itemData;
this.closeItemDetail();
RecastPanel.shared.show(itemData);
} else if (type == EItemMenu.RESOLVE) {
let itemData = ItemUtil.itemData;
this.closeItemDetail();
let characters = "待鑑定的";
if (itemData.BaseAttr != "[]") {
characters = "";
}
// FGAlert.show(`確定將${characters}佩飾[color=${this.getBaldricColor(itemData)}][${itemData.EName}][/color]分解為${this.getBaldricScore(itemData)}點功績?`, () => {
// FGAlert.hide();
// }, () => {
// FGAlert.hide();
let params = {
roleid: GameModel.player.roleid,
equipid: itemData.EquipID,
}
GameModel.send("c2s_baldric_resolve", params);
// });
} else if (type == EItemMenu.RESOLVEAll) {
// this.closeItemDetail();
// FGAlert.show(`確定將背包內所有佩飾分解為功績?`, () => {
// FGAlert.hide();
// }, () => {
// FGAlert.hide();
let params = {
roleid: GameModel.player.roleid
}
GameModel.send("c2s_batch_resolve", params);
// });
} else if (type == EItemMenu.APPRAISAL) {
this.onAppraisalClick()
}
}
// 鑑定
static onAppraisalClick() {
Bag.Instance.closeBagPanel();
let url = `Prefabs/Accessory/accessory_main_third`;
cc.loader.loadRes(url, cc.Prefab, (error, prefab) => {
if (error) {
SKLogger.warn(`$警告:加載資源${url}錯誤!`);
return;
}
PopupManager.showView(prefab, 0, (node) => {
var jsScript = node.getComponent("Appraisal");
jsScript && jsScript.initPanel(this.itemData)
this.closeItemDetail();
});
});
}
// 裝備
static equip() {
GameModel.send('c2s_equip_update', {
operation: 1,
roleid: GameModel.player.roleid,
equipid: this.itemData.EquipID
});
this.closeItemDetail();
}
// 卸下
static unload() {
GameModel.send('c2s_equip_update', {
operation: 2,
roleid: GameModel.player.roleid,
equipid: this.itemData.EquipID
});
this.closeItemDetail();
}
// 是否裝備
static isEquip(data: any): boolean {
if (data.EquipID == null) {
return false;
}
let equipId = GameModel.equipData.use[data.EIndex];
if (equipId == null) {
return false;
}
if (equipId != data.EquipID) {
return false;
}
return true;
}
static getSuitSkill(data: any): string {
// if (data.LianhuaAttr) {
// let lianhuaInfo = SKDataUtil.jsonBy(info.LianhuaAttr);
// if (Array.isArray(lianhuaInfo)) {
// for (const info of lianhuaInfo) {
// for (const key in info) {
// this.addInfoLab(GameUtil.getAttrTypeL1Name(key), this.infoPos, false, new cc.color(46, 143, 9));
// let valuestr = info[key];
// if (GameUtil.equipTypeNumerical.indexOf(Number(key)) == -1) {
// valuestr = (valuestr > 0 ? '+' : '') + (valuestr / 10).toFixed(1) + '%';
// }
// else {
// valuestr = (valuestr > 0 ? '+' : '') + valuestr;
// }
// this.addInfoLab(valuestr, SKUIUtil.add(this.infoPos, cc.v2(120, 0)), true, new cc.color(46, 143, 9));
// break;
// }
// }
// }
// }
let itemData = ItemUtil.getItemData(data.Type);
if (itemData) {
let suitData = ItemUtil.getBaldricSuit(itemData.level);
let suitSkill = ItemUtil.getBaldricSuitSkill();
// if (!suitSkill)
// suitSkill = { id: -1 };
let suitSkillId = suitSkill ? suitSkill.id : -1;
let skills = this.getSuitSkillGroup(suitData.group);
let suitInfo = `【套裝技能】`;
let index = 0;
for (let skill of skills) {
if (index >= data.Grade) break;
if (suitSkillId == skill.id) { //啟用設定
suitInfo += `\n[img]ui://main_ui/${skill.icon}[/img] `;
suitInfo += `[color=${this.getSuitSkillColor(skill)}]${skill.name}[/color]`;
} else { //未激活
suitInfo += `\n[img]ui://main_ui/${skill.icon}[/img] `;
suitInfo += `[color=${this.getSuitSkillUnActiveColor(skill)}]${skill.name}(未激活)[/color]`;
}
index++;
}
return suitInfo;
}
return ``;
}
// 獲得佩飾套裝技能
static getBaldricSuitSkill(): SkillBase {
let suitId: number = -1;
let suitShot: string = "";
let suitCount: number = 0;
let equipData: any = GameModel.equipData;
for (let key in equipData.use) {
let equipId = equipData.use[key];
let equip = equipData.info[equipId];
if (ItemUtil.isBaldric(equip.EIndex)) {
let itemData = ItemUtil.getItemData(equip.Type);
if (itemData) {
if (suitShot == "") {
suitShot = itemData.detailshot;
suitId = itemData.level;
suitCount++;
} else if (suitShot == itemData.detailshot) {
suitId = Math.min(suitId, itemData.level);
suitCount++;
} else {
break;
}
}
}
}
if (suitCount >= 5) {
let suitData = ItemUtil.getBaldricSuit(suitId);
if (suitData) {
let skill = SkillUtil.getSkill(suitData.skill);
this.suitId = suitId;
this.suitSkillId = skill.id;
return skill;
}
}
this.suitId = 0;
this.suitSkillId = ESkillType.NONE;
return null;
}
static addLine(value: string, line: string): string {
if (line.length > 0) {
value += `\n${line}`;
}
return value;
}
static getGrade(grade: number): string {
let result = ``;
if (grade == 2) {
result += "珍藏";
} else if (grade == 3) {
result += "無價";
} else {
result += "把玩";
}
return result;
}
static getIndex(index: number): string {
if (index == EEquipIndex.CAPE) {
return "【配飾部位】披風";
}
if (index == EEquipIndex.PENDANT) {
return "【配飾部位】挂件";
}
if (index == EEquipIndex.BELT) {
return "【配飾部位】腰帶";
}
if (index == EEquipIndex.RING_LEFT) {
return "【配飾部位】戒指・左";
}
if (index == EEquipIndex.RING_RIGHT) {
return "【配飾部位】戒指・右";
}
return "【配飾部位】未知";
}
// 適用
static getUse(data: any): string {
let result = `【配飾適用】`;
if (data.Sex == 9 && data.Race == 9) {
return `${result}通用`;
}
if (data.OwnerRoleId && data.OwnerRoleId > 0) {
if (data.OwnerRoleId != GameModel.player.resid) {
result += `[color=#FF0000]${GameUtil.roleName[data.OwnerRoleId]}[/color]`;
return result;
} else {
result += `${GameUtil.roleName[data.OwnerRoleId]}`;
return result;
}
} else {
// 非種族數組
if (!Array.isArray(data.Race)) {
if (data.Race != GameModel.player.race) {
if (data.Sex == 9) {
result += `[color=#FF0000]${this.raceName[data.Race - 1]}[/color]`;
} else {
result += `[color=#FF0000]${this.sexName[data.Sex - 1]}${this.raceName[data.Race - 1]}[/color]`;
}
return result;
} else {
if (data.Sex == 9) {
result += `${this.raceName[data.Race - 1]}`;
} else {
result += `${this.sexName[data.Sex - 1]}${this.raceName[data.Race - 1]}`;
}
return result;
}
} else {
var str = "";
var canUse = false;
for (let i = 0; i < data.Race.length; i++) {
str += this.getUseRace(data.Race[i], data.Sex);
if (data.Race[i] == GameModel.player.race)
canUse = true
if (i + 1 != data.Race.length)
str += "、"
}
if (!canUse)
str = `[color=#FF0000]${str}[/color]`
return result + str;
}
}
}
static getUseRace(race, sex) {
if (sex == 9) {
return this.raceName[race - 1]
} else {
return this.sexName[sex - 1] + this.raceName[race - 1]
}
}
static getLevel(data: any): string {
let result = `【等級需求】`;
if (data.NeedGrade) {
if (data.NeedRei) {
if (data.NeedRei < 4) {
result += `${data.NeedRei}`;
} else {
result += `飛升`;
}
}
result += `${data.NeedGrade}`;
if (data.NeedGrade > GameModel.player.level || data.NeedRei > GameModel.player.relive) {
return `[color=#FF0000]${result}[/color]`;
} else {
return result;
}
}
}
static getBase(data: any): string {
let attr1 = GameModel.player.gameData.attr1;
let result = ``;
if (data.Shuxingxuqiu && data.Shuxingxuqiu.length > 0) {
let xuqiuInfo = SKDataUtil.jsonBy(data.Shuxingxuqiu);
for (let key in xuqiuInfo) {
let type = SKDataUtil.toNumber(key);
let item = `${GameUtil.getAttrTypeL2Name(type)}要求】${xuqiuInfo[type]}\n`;
if (attr1[key] < xuqiuInfo[key]) {
result += `[color=#FF0000]${item}[/color]`;
} else {
result += `${item}`;
}
break;
}
}
return result;
}
static getEndure(data: any): string {
let result = `【配飾耐久】${data.MaxEndure}/${data.MaxEndure}`;
return result;
}
static getCan(data: any): string {
if (data.EIndex == 7) {
return `[color=#73f875]可重鑄[/color]`
}
return ``;
}
static closeItemDetail() {
if (this.itemDetailAlert == null) {
return;
}
this.itemDetailAlert.dispose();
this.itemDetailAlert = null;
this.itemData = null;
}
static closeSuitDetail() {
if (this.suitDetailAlert == null) {
return;
}
this.suitDetailAlert.dispose();
this.suitDetailAlert = null;
}
static getBaldricSuit(suitId: number): any {
let conf = GameModel.game_conf.baldric_suit;
let data = SKDataUtil.valueForKey(conf, suitId);
return data;
}
// 顯示道具數據
static showItem(itemBtn: fgui.GButton, itemData: any, hasEffect: boolean = false) {
if (itemBtn == null || itemData == null) {
return;
}
;
itemBtn.data = itemData;
itemBtn.icon = `ui://main_ui/${itemData.icon}`;
let tip = FGUtil.getTextField(itemBtn, "tip");
tip.text = `${SKDataUtil.transform(itemData.count)}`;
tip.visible = true;
let dugBG = FGUtil.getImage(itemBtn, "dug_bg");
dugBG.visible = false;
let effect = FGUtil.getAnim(itemBtn, "effect");
effect.visible = hasEffect;
effect.playing = hasEffect;
}
// 清除道具顯示
static clearItemBtn(itemBtn: fgui.GButton) {
if (itemBtn == null) {
return;
}
itemBtn.data = null;
itemBtn.icon = "";
let tip = FGUtil.getTextField(itemBtn, "tip");
tip.text = "";
tip.visible = false;
let dugBG = FGUtil.getImage(itemBtn, "dug_bg");
dugBG.visible = false;
let effect = FGUtil.getAnim(itemBtn, "effect");
effect.visible = false;
effect.playing = false;
}
static getItemCountByType(type) {
var conf = GameModel.game_conf.item
var count = 0
for (let itemId in conf) {
var item = this.getItemData(itemId)
if (!!item && type == item.type) {
count = count + 1
}
}
return count
}
static getItemsByType(type) {
var conf = GameModel.game_conf.item
var list = []
for (let itemId in conf) {
var item = this.getItemData(itemId)
if (!!item && type == item.type) {
list.push(item)
}
}
return list
}
}