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); } } }