xy-server/game/object/ChangeCard.ts

276 lines
10 KiB
TypeScript
Raw Normal View History

2025-04-23 09:34:08 +08:00
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);
}
}
}