xy-server/game/object/ChangeCard.ts
2025-04-23 09:34:08 +08:00

276 lines
10 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 DB from "../utils/DB";
import SKLogger from "../gear/SKLogger";
import * as schedule from "node-schedule";
import {EAttrCalType, MsgCode} from "../role/EEnum";
import PlayerMgr from "../object/PlayerMgr";
import SKDataUtil from "../gear/SKDataUtil";
import GoodsMgr from "../item/GoodsMgr";
import GameUtil from "../core/GameUtil";
import FivePhases from "../object/FivePhases";
export default class ChangeCard {
static shared = new ChangeCard();
cardlist: any[];
uselist: any[];
schedule: any;// 定时器
constructor() {
this.cardlist = [];
this.uselist = [];
}
init() {
this.readDB();
this.useList();
this.schedule = schedule.scheduleJob("0 0/1 * * * ? ", () => {
for (let i = 0; i < this.uselist.length; i++) {
if (this.uselist[i] == undefined) {
continue;
}
let endtime = new Date().getTime();
if (endtime > this.uselist[i].endtime) {//变身卡到期
this.clearCard(this.uselist[i].roleid, this.uselist[i].resid);
let sql = `DELETE FROM use_change_card WHERE roleid = '${this.uselist[i].roleid}';`;
DB.query(sql, (error: any, rows: any) => {
if (error) {
return;
}
})
let player = PlayerMgr.shared.getPlayerByRoleId(this.uselist[i].roleid);
if(player){
player.send('s2c_notice', {
strRichText: `变身时间到期,您的变身卡效果消失了`
});
}
delete this.uselist[i];
}
}
})
}
readDB() {
let sql = `SELECT * FROM qy_change_card`;
DB.query(sql, (error: any, rows: any) => {
for (let i = 0; i < rows.length; i++) {
this.cardlist.push({
cardid: rows[i].card_id, //变身卡id
resid: rows[i].resid, //外观id
cardname: rows[i].card_name, //变身卡名字
relive: rows[i].relive, //转生
level: rows[i].level, //等级
cardtype: rows[i].card_type, //变身卡类型 (1: 强法2: 抗性3: 物理)
cardstate: rows[i].card_state, //变身卡状态 (0: 不变1: 变身)
fplevel: rows[i].five_phases_level, //五行等级
validtime: rows[i].valid_time, //有效时间
gain: rows[i].gain, //属性增益
fivephases: rows[i].five_phases, //五行
fpmarkup: rows[i].five_phases_markup, //五行加成
});
}
});
}
useList() {
let callback = (ret: any, rows: any) => {
if (ret == MsgCode.SUCCESS) {
for (let i = 0; i < rows.length; i++) {
this.uselist.push({
roleid: rows[i].roleid,
resid: rows[i].resid,
cardid: rows[i].card_id,
usetime: rows[i].usetime,
endtime: rows[i].endtime,
gain: rows[i].gain,
fivephases: rows[i].five_phases,
})
}
}
}
DB.selectUseCard(callback);
}
//查询使用的变身卡
selectUseCard(roleid: any) {
for (let i = 0; i < this.uselist.length; i++) {
if (this.uselist[i] == undefined) {
continue;
}
if(roleid == this.uselist[i].roleid){
let card = this.getCard(this.uselist[i].cardid);
return card;
}
}
return null;
}
//变身卡详情页
detailPage(roleid: any) {
for (let i = 0; i < this.uselist.length; i++) {
if (this.uselist[i] == undefined) {
continue;
}
if(roleid == this.uselist[i].roleid){
let card = {
cardid: this.uselist[i].cardid,
endtime: this.uselist[i].endtime
};
return card;
}
}
return null;
}
/**
* 检测玩家是否使用过变身卡 如果使用过删除
* @param roleid
*/
selectUseList(roleid: any) {
for (let i = 0; i < this.uselist.length; i++) {
if (this.uselist[i] == undefined) {
continue;
}
if (roleid == this.uselist[i].roleid) {//替换变身卡
this.clearCard(this.uselist[i].roleid, this.uselist[i].resid);
delete this.uselist[i];
let sql = `DELETE FROM use_change_card WHERE roleid = '${roleid}';`;
DB.query(sql, (error: any, rows: any) => {
if (error) {
return;
}
})
break;
}
}
}
getCardInfoByCardId(cardid: any) {
for (let key in this.cardlist) {
let card = this.cardlist[key];
if (card.cardid == cardid) {
return card;
}
}
}
// 获取变身卡数据
getCard(cardid: any) {
for (let key in this.cardlist) {
let card = this.cardlist[key];
if (card.cardid == cardid) {
return card;
}
}
}
//数据暂存
dataTS(player: any, card: any) {
let usetime = new Date().getTime();
let validtime = 120 * 60 * 1000;
let endtime = usetime + validtime;
this.uselist.push({
roleid: player.roleid,
resid: player.resid,
cardid: card.cardid,
usetime: usetime,
endtime: endtime,
gain: card.gain,
fivephases: card.fivephases,
})
let sql = `INSERT INTO use_change_card(roleid, resid, card_id, usetime, endtime, gain, five_phases) VALUES('${player.roleid}','${player.resid}','${card.cardid}','${usetime}','${endtime}','${card.gain}','${card.fivephases}');`;
DB.query(sql, (error: any, rows: any) => {
if (error) {
let info = DB.errorInfo(error);
SKLogger.warn(`数据:插入错误[${info}]`);
return;
}
if (rows.length == 0) {
return;
}
})
}
// 变身卡分解
cardResolve(player: any, data: any) {
let item = GoodsMgr.shared.getItemInfo(data.itemid);
if (item == null) {
return;
}
let n = player.getBagItemNum(data.itemid);
if (n >= data.count) {
let card = this.getCard(data.itemid);
//神兽卡
if (item.level == 1003) {
player.addItem(data.itemid, -data.count, false, `${card.name}分解`);
player.addItem(100315, data.count, false, `${card.name}分解`);
}
//特殊卡
if (item.level == 1002) {
player.addItem(data.itemid, -data.count, false, `${card.name}分解`);
player.addItem(100313, data.count, false, `${card.name}分解`);
}
//高级卡
if (item.level == 1001) {
player.addItem(data.itemid, -data.count, false, `${card.name}分解`);
player.addItem(100311, data.count, false, `${card.name}分解`);
}
}
}
//清除增益效果
clearCard(roleid: any, resid: any) {
let player = PlayerMgr.shared.getPlayerByRoleId(roleid);
if (player) {
player.calculateAttr()
let pdata = player.getData();
pdata.resid = player.resid;
pdata.changeid = 0;
player.send('s2c_player_data', pdata);
}
}
checkCard(roleid: number){
//检查数据库没有到期的变身卡
let player = PlayerMgr.shared.getPlayerByRoleId(roleid);
if (player){
for (let i = 0; i < this.uselist.length; i++) {
if (this.uselist[i] == undefined) {
continue;
}
if(roleid == this.uselist[i].roleid){
let card = this.getCard(this.uselist[i].cardid);
let gain = SKDataUtil.jsonBy(this.uselist[i].gain);
let fpmarkup = FivePhases.shared.getfpMarkup(player.roleid,card);
if(player){
player.calculateAttr();
for (let key in gain) {
let key1 = Number(key);
let value = 0;
if(key1 < 75 && key1 > 69){
value = gain[key];
}else{
value = Math.floor(gain[key] + (gain[key] * (fpmarkup / 100)));
}
let addattr = GameUtil.attrToBaseAttr[key1];
if (addattr != null) {
let target_attr = addattr.target;
if (addattr.cal == EAttrCalType.ADD_PERCENT) {
player.attr1[target_attr] = Math.floor((1 + value / 100) * player.attr1[target_attr]);
if(target_attr == 30 || target_attr == 32){
let attr = target_attr += 1;
player.attr1[attr] = Math.floor((1 + value / 100) * player.attr1[target_attr]);
}
}
} else {
player.attr1[key1] += value;
}
}
}
break;
}
}
let pdata = player.getData();
player.send('s2c_player_data', pdata);
}
}
}