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

427 lines
14 KiB
TypeScript

import GameModel from "../core/GameModel";
import ItemUtil from "../core/ItemUtil";
import MsgAlert from "../game/msg/MsgAlert";
import FGUtil from "../gear_2.3.4/fgui/FGUtil";
import SKDataUtil from "../gear_2.3.4/util/SKDataUtil";
import SKUIUtil from "../gear_2.3.4/util/SKUIUtil";
const { ccclass, property } = cc._decorator;
export default class Arena extends cc.Component {
/**
* 競技場單例實例
*/
public static Instance : Arena = null;
/**
* 競技場面板
*/
arenaPanel : fgui.GComponent = null;
/**
* 戰報面板
*/
reportPanel : fgui.GComponent = null;
/**
* 兌換面板
*/
convertPanel : fgui.GComponent = null;
/**
* 需要加載的預製體
*/
prefabObject : any = {};
/**
* 刷新冷卻時間
*/
refreshCD : number = 0;
/**
* 積分兌換商品列表
*/
convertItemsList : any = [];
/**
* 當前選擇的商品信息
*/
selectedGoodItemsInfo : any = [];
/**
* 是否是進入戰鬥後隱藏
*/
isBtlHide : boolean = false;
onLoad() {
if (Arena.Instance === null) {
Arena.Instance = this;
this.loadPrefab();
} else {
this.destroy();
return;
}
}
/**
* 加載預製體
*/
loadPrefab() {
// 加載所需的預製體
var prefabList = [
{ url: "Prefabs/UIRole", name: "UIRole" },
]
this.prefabObject = {}
for (let item of prefabList) {
cc.loader.loadRes(item.url, cc.Prefab, (err, prefab) => {
if (err)
console.warn(err);
else {
this.prefabObject[item.name] = prefab;
}
})
}
}
openArenaPanel(list : any = [], selfInfo = null, refresh : Boolean = false) {
if (!this.arenaPanel || (this.arenaPanel && !this.arenaPanel.node && !SKUIUtil.isValid(this.arenaPanel.node))) {
this.arenaPanel = FGUtil.create("main_ui", "arena_panel");
FGUtil.root().addChild(this.arenaPanel);
this.arenaPanel.makeFullScreen();
this.addUIRole();
}
let listBox = FGUtil.getList(this.arenaPanel, "alert/list")
listBox.removeChildrenToPool();
if (this.refreshCD > 0) {
FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 1;
FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`;
}
if (refresh) {
var score = 0;
if (GameModel.equipData && GameModel.equipData.score)
score = GameModel.equipData.score;
FGUtil.getTextField(this.arenaPanel, "alert/rank").text = selfInfo.arena.ranking;
FGUtil.getTextField(this.arenaPanel, "alert/arena").text = selfInfo.arena.jpoint;
FGUtil.getTextField(this.arenaPanel, "alert/hasTimes").text = selfInfo.arena.count;
FGUtil.getTextField(this.arenaPanel, "alert/equipScore").text = score.toString();
let timeWait = 0;
for (let i = 0; i < list.length; i++) {
this.scheduleOnce(() => {
let item = listBox.addItemFromPool().asCom;
item.visible = false
FGUtil.getTextField(item, "rankLabel").text = list[i][7];
FGUtil.getTextField(item, "name").text = list[i][2];
FGUtil.getLoader(item, "ava").texture = GameModel.getRoleHead(list[i][1]);
FGUtil.getTextField(item, "eqScore").text = list[i][8];
var btn = FGUtil.getButton(item, "btn");
btn.visible = (selfInfo.arena.ranking > 10 && i < 5) ? false : true
btn.clearClick();
btn.onClick(() => {
GameModel.send("c2s_arenaPK", { troleid: list[i][0], type: 2 });
}, this)
this.scheduleOnce(() => {
item.visible = true
}, 0)
}, timeWait)
timeWait += 0.01;
}
this.arenaPanel.visible = true;
return
}
var mask = FGUtil.getComponent(this.arenaPanel, "mask");
var close = FGUtil.getButton(this.arenaPanel, "alert/closeBtn");
this.pushCloseEvent(mask, this.arenaPanel, () => { listBox.removeChildrenToPool(); this.unscheduleAllCallbacks(); });
this.pushCloseEvent(close, this.arenaPanel, () => { listBox.removeChildrenToPool(); this.unscheduleAllCallbacks(); });
var historyBtn = FGUtil.getButton(this.arenaPanel, "alert/history");
historyBtn.onClick(() => {
GameModel.send("c2s_report", { troleid: GameModel.player.roleid })
this.openReportPanel();
}, this)
var convertBtn = FGUtil.getButton(this.arenaPanel, "alert/convert");
convertBtn.onClick(() => {
this.openConvertPanel();
}, this)
var cdBtn = FGUtil.getButton(this.arenaPanel, "alert/refreshBtn");
cdBtn.onClick(() => {
if (this.refreshCD > 0) {
MsgAlert.addMsg("請稍等再重置");
return;
}
GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid })
this.refreshCD = 5;
FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 1;
FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`;
this.schedule(() => {
this.refreshCD--;
if (this.refreshCD <= 0) {
FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 0
this.unscheduleAllCallbacks()
return
}
FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`;
}, 1, 4)
}, this)
GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid })
}
hideArenaPanel() {
if (!this.arenaPanel || !this.arenaPanel.node) return
this.isBtlHide = true;
this.arenaPanel.visible = false;
this.unscheduleAllCallbacks();
}
showArenaPanel() {
if (!this.arenaPanel || !this.arenaPanel.node) return
this.isBtlHide = false;
GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid })
}
openReportPanel(list : any = [], refresh : Boolean = false) {
if (!this.reportPanel || (this.reportPanel && !this.reportPanel.node && !SKUIUtil.isValid(this.reportPanel.node))) {
this.reportPanel = FGUtil.create("main_ui", "report_panel");
FGUtil.root().addChild(this.reportPanel);
this.reportPanel.makeFullScreen();
}
let listBox = FGUtil.getList(this.reportPanel, "alert/list")
listBox.removeChildrenToPool();
if (refresh) {
for (let i = 0; i < list.length; i++) {
let item = listBox.addItemFromPool().asCom;
FGUtil.getTextField(item, "idx").text = list[i].ranking;
FGUtil.getTextField(item, "name").text = list[i].erolename;
FGUtil.getTextField(item, "time").text = this.getTimeStr(list[i].cdate);
FGUtil.getLoader(item, "icon").texture = GameModel.getRoleHead(list[i].eresid);
FGUtil.getControl(item, "type").selectedIndex = list[i].iswin ? list[i].ranking > 0 ? 1 : 2 : 0;
}
return
}
var mask = FGUtil.getComponent(this.reportPanel, "mask");
var close = FGUtil.getButton(this.reportPanel, "alert/close");
this.pushCloseEvent(mask, this.reportPanel, () => { listBox.removeChildrenToPool() });
this.pushCloseEvent(close, this.reportPanel, () => { listBox.removeChildrenToPool() });
}
openConvertPanel(list : any = [], refresh : Boolean = false) {
console.log("openConvertPanelopenConvertPanelopenConvertPanelopenConvertPanel")
if (!this.convertPanel || (this.convertPanel && !this.convertPanel.node && !SKUIUtil.isValid(this.convertPanel.node))) {
this.convertPanel = FGUtil.create("main_ui", "arena_exchange_panel");
FGUtil.root().addChild(this.convertPanel);
this.convertPanel.makeFullScreen();
}
FGUtil.dispose(this.arenaPanel);
this.arenaPanel = null;
let listBox = FGUtil.getList(this.convertPanel, "alert/list")
listBox.removeChildrenToPool();
this.convertItemsList = []
if (refresh) {
console.log(refresh)
for (let i = 0; i < list.length; i++) {
let item = listBox.addItemFromPool().asCom;
this.convertItemsList.push(item);
let itemData = SKDataUtil.clone(ItemUtil.getItemData(list[i].itemid));
itemData.price = list[i].price = list[i].price
FGUtil.getTextField(item, "title").text = itemData.name;
FGUtil.getTextField(item, "price").text = itemData.price;
FGUtil.getLoader(item, "icon").texture = ItemUtil.getItemIcon(itemData.icon);
item.clearClick();
item.onClick(() => {
this.selectConvertGoodItems(i, itemData);
}, this)
if (i == 0)
this.selectConvertGoodItems(0, itemData)
}
return;
}
var mask = FGUtil.getComponent(this.convertPanel, "mask");
var close = FGUtil.getButton(this.convertPanel, "alert/n4");
this.pushCloseEvent(mask, this.convertPanel, () => { listBox.removeChildrenToPool() });
this.pushCloseEvent(close, this.convertPanel, () => { listBox.removeChildrenToPool() });
this.initClacPad(FGUtil.getButton(this.convertPanel, "alert/calc"));
FGUtil.getButton(this.convertPanel, "alert/n48").onClick(() => {
FGUtil.getTextField(this.convertPanel, "alert/count").text = "";
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString();
FGUtil.getComponent(this.convertPanel, "alert/calc").visible = true
})
FGUtil.getButton(this.convertPanel, "alert/reduce").onClick(() => {
this.reduceGoods();
})
FGUtil.getButton(this.convertPanel, "alert/add").onClick(() => {
this.addGoods();
})
FGUtil.getButton(this.convertPanel, "alert/buy_btn").onClick(() => {
var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text);
num = num > 0 ? num : 1;
GameModel.send("c2s_buy_from_npc", {
nCnt: num,
nConfigID: 10240,
nItemID: this.selectedGoodItemsInfo.id
})
})
GameModel.send("c2s_ask_npc_shop_item", { nNpcConfigID: 10240 })
}
/**
* 選擇積分兌換商品項目
* @param idx 商品下標
*/
selectConvertGoodItems(idx, info) {
for (let i in this.convertItemsList) {
FGUtil.getControl(this.convertItemsList[i], "selected").selectedIndex = i == idx ? 1 : 0;
}
this.showConvertGoodInfo(info)
}
/**
* 顯示積分兌換商品信息
*/
showConvertGoodInfo(data : any) {
if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node))
return;
this.selectedGoodItemsInfo = data;
FGUtil.getTextField(this.convertPanel, "alert/name").text = data.name;
FGUtil.getTextField(this.convertPanel, "alert/des").text = data.description + "\n【類型】" + data.typedetail + "\n【用途】" + data.usedetail;
FGUtil.getTextField(this.convertPanel, "alert/count").text = "1";
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = data.price;
}
/**
* 減少商品數量
*/
reduceGoods() {
if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node))
return;
var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text);
if (num <= 1)
return
num--;
FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString();
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString();
}
/**
* 增加商品數量
*/
addGoods() {
if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node))
return;
var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text);
if (num >= 99999)
return
num++;
FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString();
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString();
}
initClacPad(pad) {
for (let i = 0; i < 10; i++) {
FGUtil.getButton(pad, `n${i}`).clearClick();
FGUtil.getButton(pad, `n${i}`).onClick(() => {
var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text;
numStr += i;
var num = parseInt(numStr);
if (num >= 99999)
num = 99999
FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString();
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString();
})
}
FGUtil.getButton(pad, `n10`).clearClick();
FGUtil.getButton(pad, `n10`).onClick(() => {
FGUtil.getTextField(this.convertPanel, "alert/count").text = "";
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString();
})
FGUtil.getButton(pad, `n12`).clearClick();
FGUtil.getButton(pad, `n12`).onClick(() => {
FGUtil.getComponent(this.convertPanel, "alert/calc").visible = false;
var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text;
if (numStr == "") {
FGUtil.getTextField(this.convertPanel, "alert/count").text = "1";
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString();
}
})
FGUtil.getButton(pad, `mask`).clearClick();
FGUtil.getButton(pad, `mask`).onClick(() => {
FGUtil.getComponent(this.convertPanel, "alert/calc").visible = false;
var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text;
if (numStr == "") {
FGUtil.getTextField(this.convertPanel, "alert/count").text = "1";
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString();
}
})
}
/**
* 獲取時間對比字符串
*/
getTimeStr(str) {
var timeArr = str.split(/[: -]/)
if (timeArr.length != 6) return "";
var startTime = new Date(timeArr[0], timeArr[1] - 1, timeArr[2], timeArr[3], timeArr[4], timeArr[5]);
var endTime = new Date();
var t = (endTime.getTime() - startTime.getTime()) / 1000;
var num = Math.floor(t);
if (num < 60)
return `${num}秒前`;
t = t / 60;
num = Math.floor(t);
if (num < 60)
return `${num}分鐘前`;
t = t / 60;
num = Math.floor(t);
if (num < 24)
return `${num}小時前`;
t = t / 24;
num = Math.floor(t);
if (num < 365)
return `${num}天前`;
t = t / 365;
num = Math.floor(t);
return `${num}年前`;
}
/**
* 添加人物UI
*/
addUIRole() {
if (!this.arenaPanel.node || this.prefabObject["UIRole"] == null) return;
var roleNode = cc.instantiate(this.prefabObject["UIRole"]);
roleNode.parent = this.arenaPanel.node;
roleNode.setPosition(this.arenaPanel.node.width / 2 - 276, -285);
roleNode.getComponent("UIRole").setInfo(GameModel.player)
roleNode.getComponent("UIRole").offTouchRole();
}
/**
* 添加關閉事件
*/
pushCloseEvent(item : fairygui.GComponent, target : fairygui.GComponent, call : Function = null) {
item.clearClick();
item.onClick(() => {
call && call()
FGUtil.dispose(target);
}, this)
}
}