276 lines
10 KiB
TypeScript
276 lines
10 KiB
TypeScript
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|