xy-server/game/core/GameUtil.ts

2372 lines
82 KiB
TypeScript
Raw Permalink Normal View History

2025-04-23 09:34:08 +08:00
// 游戏工具类
import * as path from "path";
import * as os from "os";
import PartnerConfigMgr from "../object/PartnerConfigMgr";
import Player from "../object/Player";
import SKLogger from "../gear/SKLogger";
import SKDataUtil from "../gear/SKDataUtil";
import GameConf from "../../conf/GameConf";
import {EAttrCalType, EAttrTypeL1, EAttrTypeL2, EEquipType, EMagicType, ERaceType, ESexType, ESkillType} from "../role/EEnum";
import ServerConf from "../../conf/ServerConf";
import SnowFlack53 from "../gear/SnowFlake53";
import GTimer from "../common/GTimer";
export default class GameUtil {
// REDIS服务是否开启
static redisEnabled: boolean = true;
// 游戏配置
static game_conf: any;
// 本地IP地址
static localIP: string;
// 服务器配置
static serverConf: ServerConf;
// 服务器类型
static serverType: string;
// 网络类型
static netType: string;
// 服务器索引
static serverId: number;
// 服务器名称
static serverName: string;
// 世界时间控制
static gameTime: number = 0;
// 游戏帧时间
static frameTime: number;
// 30分钟后销毁战斗数据
static battleSkipTime: number = 30 * 60 * 1000;
// 每5分钟保存一次玩家数据
static savePlayerTime: number = 5 * 60 * 1000;
// 是否关服
static isClose: boolean = false;
// 在线玩家人数
static online: number = 0;
// 保存玩家人数
static saveCount: number = 0;
// 保存玩家总数
static saveTotal: number = 0;
// 机器人总数
static robotCount: number = 0;
// 存档失败纪录
static saveFailed: any[] = [];
// 坐骑技能升级道具
static horseSkillUpItemId: number = 10607; // 丹书密卷
// 坐骑洗炼道具
static horseRefiningItemId: number = 10608; // 净露玉瓶
// 炼化锁消耗仙玉
static lockJade = [10, 20, 30];
static limitPartnerLevel = 35;
private static snowFlake53: SnowFlack53;
static attrToBaseAttr: any = {
[EAttrTypeL1.HP_ADD]: {
cal: EAttrCalType.ADD_PERCENT,
target: EAttrTypeL1.HP,
},
[EAttrTypeL1.SPD_ADD]: {
cal: EAttrCalType.ADD_PERCENT,
target: EAttrTypeL1.SPD,
},
[EAttrTypeL1.MP_ADD]: {
cal: EAttrCalType.ADD_PERCENT,
target: EAttrTypeL1.MP,
},
[EAttrTypeL1.ATK_ADD]: {
cal: EAttrCalType.ADD_PERCENT,
target: EAttrTypeL1.ATK,
},
[EAttrTypeL1.HP_PERC]: {
cal: EAttrCalType.PERCENT,
target: EAttrTypeL1.HP,
},
[EAttrTypeL1.MP_PERC]: {
cal: EAttrCalType.PERCENT,
target: EAttrTypeL1.MP,
},
[EAttrTypeL1.ATK_PERC]: {
cal: EAttrCalType.PERCENT,
target: EAttrTypeL1.ATK,
},
[EAttrTypeL1.SPD_PERC]: {
cal: EAttrCalType.PERCENT,
target: EAttrTypeL1.SPD,
},
}
// 界面图标是否展示 0展示 1不展示
static iconList = {"vip": 0,"dream": 0,"lock": 1,"fytz": 0,"kac": 1, "tie": 0, "au": GameConf.accumulative, "level":0, "sign":0, "special": 0};
static flagGoods = ["1003010", "1003020", "1003030", "1003040", "1003050", "1003060", "1003070", "1003080", "1003090", "100320", "100321", "100322", "100323"];
static firstLevelCode = [65665, 65666, 65667, 65668, 65669];
static attrTypeL1Text = {
'DHUNLUAN': EAttrTypeL1.K_CONFUSION, // 抗混乱
'DFENGYIN': EAttrTypeL1.K_SEAL, // 抗封印
'DHUNSHUI': EAttrTypeL1.K_SLEEP, // 抗昏睡
'DDU': EAttrTypeL1.K_POISON, // 抗毒
'DFENG': EAttrTypeL1.K_WIND, // 抗风
'DHUO': EAttrTypeL1.K_FIRE, // 抗火
'DSHUI': EAttrTypeL1.K_WATER, // 抗水
'DLEI': EAttrTypeL1.K_THUNDER, // 抗雷
'DGUIHUO': EAttrTypeL1.K_WILDFIRE, // 抗鬼火
'DYIWANG': EAttrTypeL1.K_FORGET, // 抗遗忘
'DSANSHI': EAttrTypeL1.K_BLOODRETURN, // 抗三尸
'DZHENSHE': EAttrTypeL1.K_DETER, // 抗震慑
'DWULI': EAttrTypeL1.K_PHY_GET, // 抗物理
'PXISHOU': EAttrTypeL1.PHY_GET, // 物理吸收
'PMINGZHONG': EAttrTypeL1.PHY_HIT, // 命中
'PSHANBI': EAttrTypeL1.PHY_DODGE, // 闪避
'PLIANJI': EAttrTypeL1.PHY_COMBO, //连击
'PLIANJILV': EAttrTypeL1.PHY_COMBO_PROB, //连击率
'PKUANGBAO': EAttrTypeL1.PHY_DEADLY, //狂暴
'PPOFANG': EAttrTypeL1.PHY_BREAK, //破防
'PPOFANGLV': EAttrTypeL1.PHY_BREAK_PROB, //破防率
'PFANZHEN': EAttrTypeL1.PHY_REBOUND, //反震
'PFANZHENLV': EAttrTypeL1.PHY_REBOUND_PROB, //反震率
'ADEFEND': EAttrTypeL1.DEFEND_ADD, //加防
'ASPD': EAttrTypeL1.SPD_ADD, //加速
'AATK': EAttrTypeL1.ATK_ADD, //加攻
'AHP': EAttrTypeL1.HP_ADD, //加血
'AMP': EAttrTypeL1.MP_ADD, //加蓝
'AMEIHUO': EAttrTypeL1.CHARM_ADD, //加强魅惑
'HDHUNLUAN': EAttrTypeL1.HK_CONFUSION, // 忽视抗混乱
'HDFENGYIN': EAttrTypeL1.HK_SEAL, // 忽视抗封印
'HDHUNSHUI': EAttrTypeL1.HK_SLEEP, // 忽视抗昏睡
'HDDU': EAttrTypeL1.HK_POISON, // 忽视抗毒
'HDFENG': EAttrTypeL1.HK_WIND, // 忽视抗风
'HDHUO': EAttrTypeL1.HK_FIRE, // 忽视抗火
'HDSHUI': EAttrTypeL1.HK_WATER, // 忽视抗水
'HDLEI': EAttrTypeL1.HK_THUNDER, // 忽视抗雷
'HDGUIHUO': EAttrTypeL1.HK_WILDFIRE, // 忽视抗鬼火
'HDYIWANG': EAttrTypeL1.HK_FORGET, // 忽视抗遗忘
'HDSANSHI': EAttrTypeL1.HK_BLOODRETURN, // 忽视抗三尸
'HDZHENSHE': EAttrTypeL1.HK_DETER, // 忽视抗震慑
'HDWULI': EAttrTypeL1.HK_PHY_GET, // 忽视抗物理
'HP': EAttrTypeL1.HP, // 生命值
'MAXHP': EAttrTypeL1.HP_MAX, // 最在生命值
'MP': EAttrTypeL1.MP, // 魔法值
'MAXMP': EAttrTypeL1.MP_MAX, // 最大魔法值
'ATK': EAttrTypeL1.ATK, // 攻击力
'SPD': EAttrTypeL1.SPD, // 速度
'PHP': EAttrTypeL1.HP_PERC, // 生命百分比
'PMP': EAttrTypeL1.MP_PERC, // 魔法百分比
'PATK': EAttrTypeL1.ATK_PERC, // 攻击百分比
'PSPD': EAttrTypeL1.SPD_PERC, // 速度百分比
'SHUIKBPRE': EAttrTypeL1.KB_WATER, // 水狂暴率
'LEIKBPRE': EAttrTypeL1.KB_THUNDER, // 雷狂暴率
'HUOKBPRE': EAttrTypeL1.KB_FIRE, // 火狂暴率
'FENGKBPRE': EAttrTypeL1.KB_WIND, // 风狂暴率
'SANSHIKBPRE': EAttrTypeL1.KB_BLOODRETURN, // 三尸狂暴率
'GUIHUOKBPRE': EAttrTypeL1.KB_WILDFIRE, // 鬼火狂暴率
'SHUIKB': EAttrTypeL1.Q_WATER, // 水狂暴
'LEIKB': EAttrTypeL1.Q_THUNDER, // 雷狂暴
'HUOKB': EAttrTypeL1.Q_FIRE, // 火狂暴
'FENGKB': EAttrTypeL1.Q_WIND, // 风狂暴
'SANSHIKB': EAttrTypeL1.Q_BLOODRETURN, // 三尸狂暴
'GUIHUOKB': EAttrTypeL1.Q_WILDFIRE, // 鬼火狂暴
}
static attrTypeStrL1: any = {
[EAttrTypeL1.K_CONFUSION]: 'DHUNLUAN', // 抗混乱
[EAttrTypeL1.K_SEAL]: 'DFENGYIN', // 抗封印
[EAttrTypeL1.K_SLEEP]: 'DHUNSHUI', // 抗昏睡
[EAttrTypeL1.K_POISON]: 'DDU', // 抗毒
[EAttrTypeL1.K_WIND]: 'DFENG', // 抗风
[EAttrTypeL1.K_FIRE]: 'DHUO', // 抗火
[EAttrTypeL1.K_WATER]: 'DSHUI', // 抗水
[EAttrTypeL1.K_THUNDER]: 'DLEI', // 抗雷
[EAttrTypeL1.K_WILDFIRE]: 'DGUIHUO', // 抗鬼火
[EAttrTypeL1.K_FORGET]: 'DYIWANG', // 抗遗忘
[EAttrTypeL1.K_BLOODRETURN]: 'DSANSHI', // 抗三尸
[EAttrTypeL1.K_DETER]: 'DZHENSHE', // 抗震慑
[EAttrTypeL1.K_PHY_GET]: 'DWULI', // 抗物理
[EAttrTypeL1.PHY_GET]: 'PXISHOU', // 物理吸收
[EAttrTypeL1.PHY_HIT]: 'PMINGZHONG', // 命中
[EAttrTypeL1.PHY_DODGE]: 'PSHANBI', // 闪避
[EAttrTypeL1.PHY_COMBO]: 'PLIANJI', //连击
[EAttrTypeL1.PHY_COMBO_PROB]: 'PLIANJILV', //连击率
[EAttrTypeL1.PHY_DEADLY]: 'PKUANGBAO', //狂暴
[EAttrTypeL1.PHY_BREAK]: 'PPOFANG', //破防
[EAttrTypeL1.PHY_BREAK_PROB]: 'PPOFANGLV', //破防率
[EAttrTypeL1.PHY_REBOUND]: 'PFANZHEN', //反震
[EAttrTypeL1.PHY_REBOUND_PROB]: 'PFANZHENLV', //反震率
[EAttrTypeL1.DEFEND_ADD]: 'ADEFEND', //加防
[EAttrTypeL1.SPD_ADD]: 'ASPD', //加速
[EAttrTypeL1.ATK_ADD]: 'AATK', //加攻
[EAttrTypeL1.HP_ADD]: 'AHP', //加血
[EAttrTypeL1.MP_ADD]: 'AMP', //加蓝
[EAttrTypeL1.CHARM_ADD]: 'AMEIHUO', //加强魅惑
[EAttrTypeL1.HK_CONFUSION]: 'HDHUNLUAN', // 忽视抗混乱
[EAttrTypeL1.HK_SEAL]: 'HDFENGYIN', // 忽视抗封印
[EAttrTypeL1.HK_SLEEP]: 'HDHUNSHUI', // 忽视抗昏睡
[EAttrTypeL1.HK_POISON]: 'HDDU', // 忽视抗毒
[EAttrTypeL1.HK_WIND]: 'HDFENG', // 忽视抗风
[EAttrTypeL1.HK_FIRE]: 'HDHUO', // 忽视抗火
[EAttrTypeL1.HK_WATER]: 'HDSHUI', // 忽视抗水
[EAttrTypeL1.HK_THUNDER]: 'HDLEI', // 忽视抗雷
[EAttrTypeL1.HK_WILDFIRE]: 'HDGUIHUO', // 忽视抗鬼火
[EAttrTypeL1.HK_FORGET]: 'HDYIWANG', // 忽视抗遗忘
[EAttrTypeL1.HK_BLOODRETURN]: 'HDSANSHI', // 忽视抗三尸
[EAttrTypeL1.HK_DETER]: 'HDZHENSHE', // 忽视抗震慑
[EAttrTypeL1.HK_PHY_GET]: 'HDWULI', // 忽视抗物理
/////////////////////////////////////////
[EAttrTypeL1.HP]: 'HP',
[EAttrTypeL1.HP_MAX]: 'MAXHP',
[EAttrTypeL1.MP]: 'MP',
[EAttrTypeL1.MP_MAX]: 'MAXMP',
[EAttrTypeL1.ATK]: 'ATK',
[EAttrTypeL1.SPD]: 'SPD',
[EAttrTypeL1.HP_PERC]: 'PHP',
[EAttrTypeL1.MP_PERC]: 'PMP',
[EAttrTypeL1.ATK_PERC]: 'PATK',
[EAttrTypeL1.SPD_PERC]: 'PSPD',
[EAttrTypeL1.KB_WATER]: 'SHUIKBPRE',
[EAttrTypeL1.KB_THUNDER]: 'LEIKBPRE',
[EAttrTypeL1.KB_FIRE]: 'HUOKBPRE',
[EAttrTypeL1.KB_WIND]: 'FENGKBPRE',
[EAttrTypeL1.KB_BLOODRETURN]: 'SANSHIKBPRE',
[EAttrTypeL1.KB_WILDFIRE]: 'GUIHUOKBPRE',
[EAttrTypeL1.Q_WATER]: 'SHUIKB',
[EAttrTypeL1.Q_THUNDER]: 'LEIKB',
[EAttrTypeL1.Q_FIRE]: 'HUOKB',
[EAttrTypeL1.Q_WIND]: 'FENGKB',
[EAttrTypeL1.Q_BLOODRETURN]: 'SANSHIKB',
[EAttrTypeL1.Q_WILDFIRE]: 'GUIHUOKB',
}
static mapType: any = {
Unknow: 0,
Map: 1,
Instance: 2,
}
static attrEquipTypeStr: any = {
'FatalRate': EAttrTypeL1.PHY_DEADLY, // 致命(狂暴)%       
'HitRate': EAttrTypeL1.PHY_HIT, // 命中%       
'PhyDefNef': EAttrTypeL1.PHY_BREAK, // 破防程度%     
'PhyDefNefRate': EAttrTypeL1.PHY_BREAK_PROB, // 破防概率%     
'AdAtkEhan': EAttrTypeL1.ATK_ADD, // 加强攻击%     
'CureEhan': EAttrTypeL1.CURE_EHAN, // 加强治愈%     
'SweepEhan': EAttrTypeL1.SWEEP_EHAN, // 加强横扫%     
'BreakEhan': EAttrTypeL1.BREAK_EHAN, // 加强破甲%     
'ThudEhan': EAttrTypeL1.THUD_EHAN, // 加强震击%     
'Atk': EAttrTypeL1.ATK, //攻击(原数增加)
'AdSpd': EAttrTypeL1.SPD_ADD, // 加速%     
'AdSpdEhan': EAttrTypeL1.SPD_ADD_EHAN, // 加强加速%     
'HpMax': EAttrTypeL1.HP_MAX, // 增加气血上限        
'MpMax': EAttrTypeL1.MP_MAX, // 增加法力上限        
'HpPercent': EAttrTypeL1.HP_ADD, // 气血%       
'MpPercent': EAttrTypeL1.MP_ADD, // 法力%       
'AtkPercent': EAttrTypeL1.ATK_PERC, //攻击百分比
'HpPer': EAttrTypeL1.HP_PERC, //气血百分比
'Speed': EAttrTypeL1.SPD, // 速度 (原数增加)     
'RainDef': EAttrTypeL1.K_WATER, // 抗水法%      
'ThunderDef': EAttrTypeL1.K_THUNDER, // 抗雷法%      
'FireDef': EAttrTypeL1.K_FIRE, // 抗火法%      
'WindDef': EAttrTypeL1.K_WIND, // 抗风法%      
'RainDefNeg': EAttrTypeL1.HK_WATER, // 忽视水%      
'ThunderDefNeg': EAttrTypeL1.HK_THUNDER, // 忽视雷%      
'FireDefNeg': EAttrTypeL1.HK_FIRE, // 忽视火%      
'WindDefNeg': EAttrTypeL1.HK_WIND, // 忽视风%      
'SealDef': EAttrTypeL1.K_SEAL, // 抗封印%      
'DisorderDef': EAttrTypeL1.K_CONFUSION, // 抗混乱%      
'SleepDef': EAttrTypeL1.K_SLEEP, // 抗昏睡%      
'PoisonDef': EAttrTypeL1.K_POISON, // 抗中毒%      
'SealDefNeg': EAttrTypeL1.HK_SEAL, // 忽视封印%     
'DisorderDefNeg': EAttrTypeL1.HK_CONFUSION, // 忽视混乱%     
'SleepDefNeg': EAttrTypeL1.HK_SLEEP, // 忽视昏睡%     
'PoisonDefNeg': EAttrTypeL1.HK_POISON, // 忽视毒%      
'ForgetDef': EAttrTypeL1.K_FORGET, // 抗遗忘%      
'GfireDef': EAttrTypeL1.K_WILDFIRE, // 抗鬼火%      
'SanshiDef': EAttrTypeL1.K_BLOODRETURN, // 抗三尸%      
'ForgetDefNeg': EAttrTypeL1.HK_FORGET, // 忽视遗忘%     
'GfireDefNeg': EAttrTypeL1.HK_WILDFIRE, // 忽视鬼火%     
'SanshiDefNeg': EAttrTypeL1.HK_BLOODRETURN, // 忽视三尸%     
'ShockDefNeg': EAttrTypeL1.HK_DETER, // 忽视抗震慑%        
'CharmEhan': EAttrTypeL1.CHARM_ADD, // 加强魅惑%     
'PhyDef': EAttrTypeL1.PHY_GET, // 物理吸收%     
'AdDefEhan': EAttrTypeL1.DEFEND_ADD, //加强加防%
'ShockDef': EAttrTypeL1.K_DETER, //抗震慑%
'HitCombo': EAttrTypeL1.PHY_COMBO, //连击次数
'HitComboProb': EAttrTypeL1.PHY_COMBO_PROB, //连击率
'VoidRate': EAttrTypeL1.PHY_DODGE, //躲闪%
'Basecon': EAttrTypeL2.GENGU, // 根骨
'Wakan': EAttrTypeL2.LINGXING, // 灵性
'Power': EAttrTypeL2.LILIANG, // 力量
'Agility': EAttrTypeL2.MINJIE, // 敏捷
'RainFatalRate': EAttrTypeL1.KB_WATER,
'ThunderFatalRate': EAttrTypeL1.KB_THUNDER,
'FireFatalRate': EAttrTypeL1.KB_FIRE,
'WindFatalRate': EAttrTypeL1.KB_WIND,
'SanshiFatalRate': EAttrTypeL1.KB_BLOODRETURN,
'GfireFatalRate': EAttrTypeL1.KB_WILDFIRE,
'RainFatalHurt': EAttrTypeL1.Q_WATER,
'ThunderFatalHurt': EAttrTypeL1.Q_THUNDER,
'FireFatalHurt': EAttrTypeL1.Q_FIRE,
'WindFatalHurt': EAttrTypeL1.Q_WIND,
'SanshiFatalHurt': EAttrTypeL1.Q_BLOODRETURN,
'GfireFatalHurt': EAttrTypeL1.Q_WILDFIRE,
'Kgold': EAttrTypeL1.S_GOLD,
'Kwood': EAttrTypeL1.S_WOOD,
'Kwater': EAttrTypeL1.S_WATER,
'Kfire': EAttrTypeL1.S_FIRE,
'Kearth': EAttrTypeL1.S_SOIL,
}
//抗性重铸属性
static attrEquipKangXing: any = {
'0': EAttrTypeL1.K_WATER, // 抗水法%      
'1': EAttrTypeL1.K_THUNDER, // 抗雷法%      
'2': EAttrTypeL1.K_FIRE, // 抗火法%      
'3': EAttrTypeL1.K_WIND, // 抗风法%      
'4': EAttrTypeL1.K_SEAL, // 抗封印%      
'5': EAttrTypeL1.K_CONFUSION, // 抗混乱%      
'6': EAttrTypeL1.K_SLEEP, // 抗昏睡%      
'7': EAttrTypeL1.K_POISON, // 抗中毒%      
'8': EAttrTypeL1.K_FORGET, // 抗遗忘%      
'9': EAttrTypeL1.K_WILDFIRE, // 抗鬼火%      
'10': EAttrTypeL1.K_BLOODRETURN, // 抗三尸%      
'11': EAttrTypeL1.K_DETER, //抗震慑%      
}
//武器重铸属性
static attrEquipWeapon: any = {
'0': EAttrTypeL1.PHY_DEADLY, // 致命(狂暴)%       
'1': EAttrTypeL1.PHY_HIT, // 命中%       
'2': EAttrTypeL1.PHY_BREAK, // 破防程度%     
'3': EAttrTypeL1.PHY_BREAK_PROB, // 破防概率%     
'4': EAttrTypeL1.ATK, //攻击(原数增加)
'5': EAttrTypeL1.HP_MAX, // 增加气血上限        
'6': EAttrTypeL1.MP_MAX, // 增加法力上限        
}
//人族重铸属性
static attrEquipRenHuShi: any = {
'1': EAttrTypeL1.HK_SEAL, // 忽视封印%     
'2': EAttrTypeL1.HK_CONFUSION, // 忽视混乱%     
'3': EAttrTypeL1.HK_SLEEP, // 忽视昏睡%     
'0': EAttrTypeL1.HK_POISON, // 忽视毒%      
}
//仙族重铸属性
static attrEquipXianHuShi: any = {
'1': EAttrTypeL1.HK_WATER, // 忽视水%      
'2': EAttrTypeL1.HK_THUNDER, // 忽视雷%      
'3': EAttrTypeL1.HK_FIRE, // 忽视火%      
'0': EAttrTypeL1.HK_WIND, // 忽视风%      
}
//鬼族重铸属性
static attrEquipGuiHuShi: any = {
'1': EAttrTypeL1.HK_FORGET, // 忽视遗忘%     
'2': EAttrTypeL1.HK_WILDFIRE, // 忽视鬼火%     
'0': EAttrTypeL1.HK_BLOODRETURN, // 忽视三尸%     
}
//魔族重铸属性
static attrEquipMoHuShi: any = {
'1': EAttrTypeL1.HK_DETER, // 忽视抗震慑%        
'2': EAttrTypeL1.SPD_ADD_EHAN, // 加强加速%     
'3': EAttrTypeL1.DEFEND_ADD, //加强加防%
'0': EAttrTypeL1.CHARM_ADD, // 加强魅惑%     
}
//龙族重铸属性
static attrEquipLong: any = {
'1': EAttrTypeL1.CURE_EHAN, // 加强治愈%     
'2': EAttrTypeL1.SWEEP_EHAN, // 加强横扫%     
'3': EAttrTypeL1.BREAK_EHAN, // 加强破甲%     
'0': EAttrTypeL1.THUD_EHAN, // 加强震击%     
}
//项链重铸属性
static attrEquipTorque: any = {
'1': EAttrTypeL1.SPD_ADD_EHAN, // 加强加速%     
'2': EAttrTypeL1.HP_MAX, // 增加气血上限        
'3': EAttrTypeL1.MP_MAX, // 增加法力上限        
'4': EAttrTypeL1.HP_ADD, // 气血%       
'5': EAttrTypeL1.MP_ADD, // 法力%       
'6': EAttrTypeL1.SPD, // 速度 (原数增加)     
'0': EAttrTypeL1.ATK_PERC, //攻击百分比
}
//鞋子重铸属性
static attrEquipShose: any = {
'1': EAttrTypeL1.K_WATER, // 抗水法%      
'2': EAttrTypeL1.K_THUNDER, // 抗雷法%      
'3': EAttrTypeL1.K_FIRE, // 抗火法%      
'4': EAttrTypeL1.K_WIND, // 抗风法%      
'5': EAttrTypeL1.K_SEAL, // 抗封印%      
'6': EAttrTypeL1.K_CONFUSION, // 抗混乱%      
'13': EAttrTypeL1.SPD, // 速度 (原数增加)     
'7': EAttrTypeL1.K_SLEEP, // 抗昏睡%      
'8': EAttrTypeL1.K_POISON, // 抗中毒%      
'9': EAttrTypeL1.K_FORGET, // 抗遗忘%      
'0': EAttrTypeL1.SPD_ADD_EHAN, // 加强加速%     
'10': EAttrTypeL1.K_WILDFIRE, // 抗鬼火%      
'11': EAttrTypeL1.K_BLOODRETURN, // 抗三尸%      
'12': EAttrTypeL1.K_DETER, //抗震慑%
}
// 不需要进行百分百计算的
static equipTypeNumerical = [
EAttrTypeL1.ATK, // 攻击力
EAttrTypeL1.SPD, // 速度
EAttrTypeL1.DEFEND_ADD, // 加防
EAttrTypeL1.PHY_COMBO, // 连击
EAttrTypeL1.HP_MAX, // 最大生命值
EAttrTypeL1.MP_MAX, // 最大魔法值
EAttrTypeL1.BONE, // 根骨
EAttrTypeL1.SPIRIT, // 灵性
EAttrTypeL1.STRENGTH, // 力量
EAttrTypeL1.DEXTERITY, // 敏捷
EAttrTypeL1.GOLD, // 金
EAttrTypeL1.WOOD, // 木
EAttrTypeL1.WATER, // 水
EAttrTypeL1.FIRE, // 火
EAttrTypeL1.SOIL, // 土
];
static defineSkill: any = {
[ERaceType.HUMEN]: {
[ESexType.MALE]: {
[ESkillType.JieDaoShaRen]: 0,
[ESkillType.MiHunZui]: 0,
[ESkillType.ZuoBiShangGuan]: 0,
[ESkillType.ShiXinKuangLuan]: 0,
[ESkillType.BaiRiMian]: 0,
[ESkillType.SiMianChuGe]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.HeDingHongFen]: 0,
[ESkillType.MiHunZui]: 0,
[ESkillType.ZuoBiShangGuan]: 0,
[ESkillType.WanDuGongXin]: 0,
[ESkillType.BaiRiMian]: 0,
[ESkillType.SiMianChuGe]: 0,
}
},
[ERaceType.SKY]: {
[ESexType.MALE]: {
[ESkillType.FengLeiYongDong]: 0,
[ESkillType.DianShanLeiMing]: 0,
[ESkillType.JiaoLongChuHai]: 0,
[ESkillType.XiuLiQianKun]: 0,
[ESkillType.TianZhuDiMie]: 0,
[ESkillType.JiuLongBingFeng]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.LieHuoJiaoYang]: 0,
[ESkillType.DianShanLeiMing]: 0,
[ESkillType.JiaoLongChuHai]: 0,
[ESkillType.JiuYinChunHuo]: 0,
[ESkillType.TianZhuDiMie]: 0,
[ESkillType.JiuLongBingFeng]: 0,
}
},
[ERaceType.DEMON]: {
[ESexType.MALE]: {
[ESkillType.TianWaiFeiMo]: 0,
[ESkillType.ShouWangShenLi]: 0,
[ESkillType.XiaoHunShiGu]: 0,
[ESkillType.QianKunJieSu]: 0,
[ESkillType.MoShenFuShen]: 0,
[ESkillType.YanLuoZhuiMing]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.MoShenHuTi]: 0,
[ESkillType.ShouWangShenLi]: 0,
[ESkillType.XiaoHunShiGu]: 0,
[ESkillType.HanQingMoMo]: 0,
[ESkillType.MoShenFuShen]: 0,
[ESkillType.YanLuoZhuiMing]: 0,
}
},
[ERaceType.GHOST]: {
[ESexType.MALE]: {
[ESkillType.XueShaZhiGu]: 0,
[ESkillType.LuoRiRongJin]: 0,
[ESkillType.ShiXinFeng]: 0,
[ESkillType.XiXingDaFa]: 0,
[ESkillType.XueHaiShenChou]: 0,
[ESkillType.MengPoTang]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.QinSiBingWu]: 0,
[ESkillType.LuoRiRongJin]: 0,
[ESkillType.ShiXinFeng]: 0,
[ESkillType.QianNvYouHun]: 0,
[ESkillType.XueHaiShenChou]: 0,
[ESkillType.MengPoTang]: 0,
}
},
[ERaceType.DRAGON]: {
[ESexType.MALE]: {
[ESkillType.NiLin]: 0,
[ESkillType.LingXvYvFeng]: 0,
[ESkillType.FeiJvJiuTian]: 0,
[ESkillType.PeiRanMoYv]: 0,
[ESkillType.ZeBeiWanWu]: 0,
[ESkillType.FengLeiWanJun]: 0,
[ESkillType.ZhenTianDongDi]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.NiLin]: 0,
[ESkillType.BaiLangTaoTian]: 0,
[ESkillType.CangHaiHengLiu]: 0,
[ESkillType.PeiRanMoYv]: 0,
[ESkillType.ZeBeiWanWu]: 0,
[ESkillType.FengLeiWanJun]: 0,
[ESkillType.ZhenTianDongDi]: 0,
}
},
}
static robotDefineSkill: any = {
[ERaceType.HUMEN]: {
[ESexType.MALE]: {
[ESkillType.ShiXinKuangLuan]: 0,
[ESkillType.BaiRiMian]: 0,
[ESkillType.SiMianChuGe]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.WanDuGongXin]: 0,
[ESkillType.BaiRiMian]: 0,
[ESkillType.SiMianChuGe]: 0,
}
},
[ERaceType.SKY]: {
[ESexType.MALE]: {
[ESkillType.XiuLiQianKun]: 0,
[ESkillType.TianZhuDiMie]: 0,
[ESkillType.JiuLongBingFeng]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.JiuYinChunHuo]: 0,
[ESkillType.TianZhuDiMie]: 0,
[ESkillType.JiuLongBingFeng]: 0,
}
},
[ERaceType.DEMON]: {
[ESexType.MALE]: {
[ESkillType.QianKunJieSu]: 0,
[ESkillType.MoShenFuShen]: 0,
[ESkillType.YanLuoZhuiMing]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.HanQingMoMo]: 0,
[ESkillType.MoShenFuShen]: 0,
[ESkillType.YanLuoZhuiMing]: 0,
}
},
[ERaceType.GHOST]: {
[ESexType.MALE]: {
[ESkillType.XiXingDaFa]: 0,
[ESkillType.XueHaiShenChou]: 0,
[ESkillType.MengPoTang]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.QianNvYouHun]: 0,
[ESkillType.XueHaiShenChou]: 0,
[ESkillType.MengPoTang]: 0,
}
},
[ERaceType.DRAGON]: {
[ESexType.MALE]: {
[ESkillType.ZeBeiWanWu]: 0,
[ESkillType.FeiJvJiuTian]: 0,
[ESkillType.ZhenTianDongDi]: 0,
},
[ESexType.FEMALE]: {
[ESkillType.CangHaiHengLiu]: 0,
[ESkillType.ZeBeiWanWu]: 0,
[ESkillType.ZhenTianDongDi]: 0,
}
},
}
// 成长值
static growPre: any = {
[ERaceType.HUMEN]: {
[EAttrTypeL2.GENGU]: 1.2,
[EAttrTypeL2.LINGXING]: 1,
[EAttrTypeL2.LILIANG]: 1,
[EAttrTypeL2.MINJIE]: 0.8,
},
[ERaceType.SKY]: {
[EAttrTypeL2.GENGU]: 1,
[EAttrTypeL2.LINGXING]: 1.3,
[EAttrTypeL2.LILIANG]: 0.7,
[EAttrTypeL2.MINJIE]: 1,
},
[ERaceType.DEMON]: {
[EAttrTypeL2.GENGU]: 1.1,
[EAttrTypeL2.LINGXING]: 0.6,
[EAttrTypeL2.LILIANG]: 1.3,
[EAttrTypeL2.MINJIE]: 1.2,
},
[ERaceType.GHOST]: {
[EAttrTypeL2.GENGU]: 1.2,
[EAttrTypeL2.LINGXING]: 1,
[EAttrTypeL2.LILIANG]: 0.95,
[EAttrTypeL2.MINJIE]: 0.85,
},
[ERaceType.DRAGON]: {
[EAttrTypeL2.GENGU]: 1.3,
[EAttrTypeL2.LINGXING]: 1,
[EAttrTypeL2.LILIANG]: 1.5,
[EAttrTypeL2.MINJIE]: 1.1,
},
}
// 基础一级属性
static baseAttr: any = {
[ERaceType.HUMEN]: {
[EAttrTypeL1.HP]: 360,
[EAttrTypeL1.MP]: 300,
[EAttrTypeL1.ATK]: 70,
[EAttrTypeL1.SPD]: 8,
},
[ERaceType.SKY]: {
[EAttrTypeL1.HP]: 270,
[EAttrTypeL1.MP]: 350,
[EAttrTypeL1.ATK]: 80,
[EAttrTypeL1.SPD]: 9,
},
[ERaceType.DEMON]: {
[EAttrTypeL1.HP]: 330,
[EAttrTypeL1.MP]: 210,
[EAttrTypeL1.ATK]: 80,
[EAttrTypeL1.SPD]: 10,
},
[ERaceType.GHOST]: {
[EAttrTypeL1.HP]: 300,
[EAttrTypeL1.MP]: 390,
[EAttrTypeL1.ATK]: 60,
[EAttrTypeL1.SPD]: 10,
},
[ERaceType.DRAGON]: {
[EAttrTypeL1.HP]: 300,
[EAttrTypeL1.MP]: 240,
[EAttrTypeL1.ATK]: 80,
[EAttrTypeL1.SPD]: 10,
},
}
// 1转修正
static reliveFixAttr1 = {
[ERaceType.HUMEN]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_CONFUSION]: 10,
[EAttrTypeL1.K_SEAL]: 10,
[EAttrTypeL1.K_SLEEP]: 10,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_POISON]: 10,
[EAttrTypeL1.K_SEAL]: 10,
[EAttrTypeL1.K_SLEEP]: 10,
},
},
[ERaceType.SKY]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_THUNDER]: 10,
[EAttrTypeL1.K_WATER]: 10,
[EAttrTypeL1.K_WIND]: 10,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_THUNDER]: 10, // 抗混乱
[EAttrTypeL1.K_WATER]: 10, // 抗封印
[EAttrTypeL1.K_FIRE]: 10, // 抗昏睡
},
},
[ERaceType.DEMON]: {
[ESexType.MALE]: {
[EAttrTypeL1.HP]: 8.2,
[EAttrTypeL1.MP]: 8.2,
[EAttrTypeL1.SPD]: 6.15,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.HP]: 8.2,
[EAttrTypeL1.MP]: 8.2,
[EAttrTypeL1.K_DETER]: 9.2,
},
},
[ERaceType.GHOST]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_WILDFIRE]: 10,
[EAttrTypeL1.K_FORGET]: 10,
[EAttrTypeL1.K_BLOODRETURN]: 10,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_WILDFIRE]: 10,
[EAttrTypeL1.K_FORGET]: 10,
[EAttrTypeL1.K_PHY_GET]: 15.3,
},
},
[ERaceType.DRAGON]: {
[ESexType.MALE]: {
[EAttrTypeL1.HP]: 8.2,
[EAttrTypeL1.PHY_GET]: 10,
[EAttrTypeL1.HK_PHY_GET]: 5,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.HP]: 8.2,
[EAttrTypeL1.PHY_GET]: 10,
[EAttrTypeL1.HK_PHY_GET]: 5,
},
}
}
// 2转修正
static reliveFixAttr2 = {
[ERaceType.HUMEN]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_CONFUSION]: 15,
[EAttrTypeL1.K_SEAL]: 15,
[EAttrTypeL1.K_SLEEP]: 15,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_POISON]: 15,
[EAttrTypeL1.K_SEAL]: 15,
[EAttrTypeL1.K_SLEEP]: 15,
},
},
[ERaceType.SKY]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_THUNDER]: 15,
[EAttrTypeL1.K_WATER]: 15,
[EAttrTypeL1.K_WIND]: 15,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_THUNDER]: 15, // 抗混乱
[EAttrTypeL1.K_WATER]: 15, // 抗封印
[EAttrTypeL1.K_FIRE]: 15, // 抗昏睡
},
},
[ERaceType.DEMON]: {
[ESexType.MALE]: {
[EAttrTypeL1.HP]: 12.3,
[EAttrTypeL1.MP]: 12.3,
[EAttrTypeL1.SPD]: 9.23,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.HP]: 12.3,
[EAttrTypeL1.MP]: 12.3,
[EAttrTypeL1.K_DETER]: 13.8,
},
},
[ERaceType.GHOST]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_WILDFIRE]: 15,
[EAttrTypeL1.K_FORGET]: 15,
[EAttrTypeL1.K_BLOODRETURN]: 15,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_WILDFIRE]: 15,
[EAttrTypeL1.K_FORGET]: 15,
[EAttrTypeL1.K_PHY_GET]: 23,
},
},
[ERaceType.DRAGON]: {
[ESexType.MALE]: {
[EAttrTypeL1.HP]: 16,
[EAttrTypeL1.PHY_GET]: 16.8,
[EAttrTypeL1.HK_PHY_GET]: 15.1,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.HP]: 16.3,
[EAttrTypeL1.PHY_GET]: 18,
[EAttrTypeL1.HK_PHY_GET]: 16.8,
},
}
}
// 转生修正3
static reliveFixAttr3 = {
[ERaceType.HUMEN]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_CONFUSION]: 20,
[EAttrTypeL1.K_SEAL]: 20,
[EAttrTypeL1.K_SLEEP]: 20,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_POISON]: 20,
[EAttrTypeL1.K_SEAL]: 20,
[EAttrTypeL1.K_SLEEP]: 20,
},
},
[ERaceType.SKY]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_THUNDER]: 20,
[EAttrTypeL1.K_WATER]: 20,
[EAttrTypeL1.K_WIND]: 20,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_THUNDER]: 20, // 抗混乱
[EAttrTypeL1.K_WATER]: 20, // 抗封印
[EAttrTypeL1.K_FIRE]: 20, // 抗昏睡
},
},
[ERaceType.DEMON]: {
[ESexType.MALE]: {
[EAttrTypeL1.HP]: 16.4,
[EAttrTypeL1.MP]: 16.4,
[EAttrTypeL1.SPD]: 12.3,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.HP]: 16.4,
[EAttrTypeL1.MP]: 16.4,
[EAttrTypeL1.K_DETER]: 18.5,
},
},
[ERaceType.GHOST]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_WILDFIRE]: 20,
[EAttrTypeL1.K_FORGET]: 20,
[EAttrTypeL1.K_BLOODRETURN]: 20,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_WILDFIRE]: 20,
[EAttrTypeL1.K_FORGET]: 20,
[EAttrTypeL1.K_PHY_GET]: 30.6,
},
},
[ERaceType.DRAGON]: {
[ESexType.MALE]: {
[EAttrTypeL1.HP]: 21.4,
[EAttrTypeL1.PHY_GET]: 21.4,
[EAttrTypeL1.HK_PHY_GET]: 25.4,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.HP]: 21.4,
[EAttrTypeL1.PHY_GET]: 21.4,
[EAttrTypeL1.HK_PHY_GET]: 25.6,
},
}
}
// 转生修正4
static reliveFixAttr4 = {
[ERaceType.HUMEN]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_CONFUSION]: 25,
[EAttrTypeL1.K_SEAL]: 25,
[EAttrTypeL1.K_SLEEP]: 25,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_POISON]: 25,
[EAttrTypeL1.K_SEAL]: 25,
[EAttrTypeL1.K_SLEEP]: 25,
},
},
[ERaceType.SKY]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_THUNDER]: 25,
[EAttrTypeL1.K_WATER]: 25,
[EAttrTypeL1.K_WIND]: 25,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_THUNDER]: 25, // 抗混乱
[EAttrTypeL1.K_WATER]: 25, // 抗封印
[EAttrTypeL1.K_FIRE]: 25, // 抗昏睡
},
},
[ERaceType.DEMON]: {
[ESexType.MALE]: {
[EAttrTypeL1.HP]: 22.4,
[EAttrTypeL1.MP]: 22.4,
[EAttrTypeL1.SPD]: 24.3,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.HP]: 22.4,
[EAttrTypeL1.MP]: 22.4,
[EAttrTypeL1.K_DETER]: 24.5,
},
},
[ERaceType.GHOST]: {
[ESexType.MALE]: {
[EAttrTypeL1.K_WILDFIRE]: 25,
[EAttrTypeL1.K_FORGET]: 25,
[EAttrTypeL1.K_BLOODRETURN]: 25,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.K_WILDFIRE]: 25,
[EAttrTypeL1.K_FORGET]: 25,
[EAttrTypeL1.K_PHY_GET]: 42.6,
},
},
[ERaceType.DRAGON]: {
[ESexType.MALE]: {
[EAttrTypeL1.HP]: 25,
[EAttrTypeL1.PHY_GET]: 25,
[EAttrTypeL1.HK_PHY_GET]: 50,
},
[ESexType.FEMALE]: {
[EAttrTypeL1.HP]: 25,
[EAttrTypeL1.PHY_GET]: 25,
[EAttrTypeL1.HK_PHY_GET]: 50,
},
},
}
static attrToBtlAttr: any = {
[EAttrTypeL1.ATK]: [EAttrTypeL1.ATK_ADD],
[EAttrTypeL1.K_PHY_GET]: [EAttrTypeL1.DEFEND_ADD, EAttrTypeL1.PHY_GET],
[EAttrTypeL1.SPD]: [EAttrTypeL1.SPD_ADD],
}
static atkSkills = [
EMagicType.PHYSICS, //物理
EMagicType.CHAOS, //混乱
EMagicType.TOXIN, //毒
EMagicType.SLEEP, //昏睡
EMagicType.SEAL, //封印
EMagicType.WIND, //风法
EMagicType.FIRE, //火法
EMagicType.THUNDER, //雷法
EMagicType.WATER, //水法
EMagicType.FRIGHTEN, //震慑
EMagicType.THREE_CORPSE, //三尸
EMagicType.CHARM, //魅惑
EMagicType.GHOST_FIRE, //鬼火
EMagicType.FORGET, //遗忘
EMagicType.SUB_DEFENSE, // 减防
]
static skillActOn: any = {
All: 0,
Enemy: 1,
Self: 2,
}
static defSkills: any = [
EMagicType.SPEED, //加速
EMagicType.DEFENSE, //加防
EMagicType.ATTACK, //加攻
EMagicType.HIDING, //隐身
]
static debuffSkills: any = [
EMagicType.CHAOS, //混乱
EMagicType.TOXIN, //毒
EMagicType.SLEEP, //昏睡
EMagicType.SEAL, //封印
EMagicType.CHARM, //魅惑
EMagicType.FORGET, //遗忘
EMagicType.SUB_DEFENSE, // 减防
]
static buffSkillType: any = { //法系id
[EMagicType.PHYSICS]: 0, //物理
[EMagicType.CHAOS]: 2, //混乱
[EMagicType.TOXIN]: 0, //毒
[EMagicType.SLEEP]: 0, //昏睡
[EMagicType.SEAL]: 0, //封印
[EMagicType.WIND]: 0, //风法
[EMagicType.FIRE]: 0, //火法
[EMagicType.THUNDER]: 0, //雷法
[EMagicType.WATER]: 0, //水法
[EMagicType.SPEED]: 1, //加速
[EMagicType.DEFENSE]: 1, //加防
[EMagicType.ATTACK]: 1, //加攻
[EMagicType.FRIGHTEN]: 0, //震慑
[EMagicType.THREE_CORPSE]: 0, //三尸
[EMagicType.CHARM]: 2, //魅惑
[EMagicType.GHOST_FIRE]: 0, //鬼火
[EMagicType.FORGET]: 2, //遗忘
[EMagicType.SUB_DEFENSE]: 2, // 减防
}
// 抗性列表
static skillTypeKangXing: any = {
[EMagicType.CHAOS]: EAttrTypeL1.K_CONFUSION,
[EMagicType.SEAL]: EAttrTypeL1.K_SEAL,
[EMagicType.SLEEP]: EAttrTypeL1.K_SLEEP,
[EMagicType.TOXIN]: EAttrTypeL1.K_POISON,
[EMagicType.WIND]: EAttrTypeL1.K_WIND,
[EMagicType.FIRE]: EAttrTypeL1.K_FIRE,
[EMagicType.WATER]: EAttrTypeL1.K_WATER,
[EMagicType.THUNDER]: EAttrTypeL1.K_THUNDER,
[EMagicType.GHOST_FIRE]: EAttrTypeL1.K_WILDFIRE,
[EMagicType.FORGET]: EAttrTypeL1.K_FORGET,
[EMagicType.THREE_CORPSE]: EAttrTypeL1.K_BLOODRETURN,
[EMagicType.FRIGHTEN]: EAttrTypeL1.K_DETER,
[EMagicType.PHYSICS]: EAttrTypeL1.K_PHY_GET,
}
// 忽视列表
static skillTypeStrengthen: any = {
[EMagicType.CHAOS]: EAttrTypeL1.HK_CONFUSION, // 忽视抗混乱
[EMagicType.TOXIN]: EAttrTypeL1.HK_POISON,
[EMagicType.SLEEP]: EAttrTypeL1.HK_SLEEP,
[EMagicType.SEAL]: EAttrTypeL1.HK_SEAL,
[EMagicType.WIND]: EAttrTypeL1.HK_WIND,
[EMagicType.FIRE]: EAttrTypeL1.HK_FIRE,
[EMagicType.THUNDER]: EAttrTypeL1.HK_THUNDER,
[EMagicType.WATER]: EAttrTypeL1.HK_WATER,
[EMagicType.GHOST_FIRE]: EAttrTypeL1.HK_WILDFIRE,
[EMagicType.FORGET]: EAttrTypeL1.HK_FORGET,
[EMagicType.THREE_CORPSE]: EAttrTypeL1.HK_BLOODRETURN,
[EMagicType.FRIGHTEN]: EAttrTypeL1.HK_DETER,
[EMagicType.PHYSICS]: EAttrTypeL1.HK_PHY_GET,
}
static wuXingStrengthen: any = {
[EAttrTypeL1.GOLD]: EAttrTypeL1.WOOD, // 金
[EAttrTypeL1.WOOD]: EAttrTypeL1.SOIL, // 木
[EAttrTypeL1.WATER]: EAttrTypeL1.FIRE, // 水
[EAttrTypeL1.FIRE]: EAttrTypeL1.GOLD, // 火
[EAttrTypeL1.SOIL]: EAttrTypeL1.WATER, // 土
}
static WuXingKeStrengthen: any = {
[EAttrTypeL1.S_GOLD]: EAttrTypeL1.GOLD, //强力克金
[EAttrTypeL1.S_WOOD]: EAttrTypeL1.WOOD, //强力克木
[EAttrTypeL1.S_WATER]: EAttrTypeL1.WATER, //强力克水
[EAttrTypeL1.S_FIRE]: EAttrTypeL1.FIRE, //强力克火
[EAttrTypeL1.S_SOIL]: EAttrTypeL1.SOIL, //强力克土
}
// 战斗回合类型
static BtlActionType: any = {
Initiative: 1, // 主动
Passive: 2, // 被动
}
static buffType = {
None: 0, //无buff
Loop: 1, //循环伤害
Once: 2, // 一次计算
}
// 战斗回合内 响应
static btlRespone: any = {
NoThing: 0, // 无响应
Defense: 1, // 防御
Dodge: 2, // 闪避
CriticalHit: 3, // 暴击
Catched: 4, // 被抓
NoCatch: 5, // 不能被抓
CatchFail: 6, // 捕捉失败
Protect: 7,
BeProtected: 8, //被保护
SummonBack: 9,
Summon: 10,
SummonFaild: 11,
PoFang: 12,
}
static skillEffect = {
cnt: 1, // 人数
round: 0, // 回合
hurt: 0, //伤害
hurtpre: 0, //伤害百分比
hppre: 0, // 加血百分比
mppre: 0, // 加蓝百分比
smppre: 0, // 法力减少-
hit: 0, // 命中增加+
spd: 0, // 速度增加+
atk: 0, // 攻击增加+
kongzhi: 0, // 控制抗性+
fashang: 0, // 法伤抗性+
fangyu: 0, // 防御+
hp: 0, // 增加血量
maxhp:0,//最大生命值
aihp: 0, // 智能回血(用于吸血类技能)
skongzhi: 0, // 减少控制抗性
yinshen: 0, // 隐身
attrtype: 0, //五行
attrnum: 0, //五行数值
rate: 0, //几率
}
static wuXing = {
Gold: 1,
Wood: 2,
Water: 3,
Fire: 4,
Earth: 5,
}
static actType = {
Skill: 1,
Item: 2,
Summon: 3, // 召唤
RunAway: 4, // 逃跑
Protect: 5, // 保护
Catch: 6, //捕捉
SummonBack: 7, //召还
}
static ENpcKind = {
ERole: 1,
EThing: 2,
EBomb: 3
}
//人物转职后的等级表
static reliveLimit: any = {
[1]: {
level: 100,
tolevel: 80,
price: 100,
},
[2]: {
level: 120,
tolevel: 100,
price: 100,
},
[3]: {
level: 140,
tolevel: 120,
price: 100,
},
[4]: {
level: 180,
tolevel: 150,
price: 100,
},
}
static cantPKMaps = [
1011, // 长安
1201, // 监狱
1002, // 天宫
1000, // 皇宫
1206, // 金銮殿
1012, // 地府
1202, // 白骨洞
1203, // 斜月三星洞
1208, // 兜率宫
1013, // 兰若寺
1014, // 灵兽村
3002, // 帮派
4001, // 家
];
// 帮派聊天充值总额限制
static limitBangChatCharge = 30;
// 世界聊天等级限制
static limitWorldChatLevel = 80;
// 世界聊天充值总额限制
static limitWorldChatCharge = 30;
// 世界铃铛充值总额限制
static bellMsg = 500;
static limitPetNum = 100;
static limitMail = 20;
// 创建帮会充值金额总额限制
static limitGreateBangChargeCount = 1000;
// 创建帮会个数限值
static limitChildBangCount = 9999;
// 创建帮会仙玉费用
static ChildBangCost = 300000;
static limitBroadcastList: string[] = [
'qq',
'QQ',
'微信',
'君羊',
'君.羊',
'龙马服',
'残端',
'私服',
'无线',
'裙',
'号',
]
static addLimitWord(text: string) {
if (text && text.length > 0) {
if (this.limitBroadcastList.indexOf(text) == -1)
this.limitBroadcastList.push(text);
}
}
// 开启背包消耗金额
static bagPrice = 500;
// 背包默认空间
static limitBagKindNum = 100;
// 仓库默认空间
static limitLockerKindNum = 100;
// 宠物锁技能消耗金额
static petLockSkillJade = 1000;
static shenBingBroke: number[] = [
5000,
2500,
1000,
500,
]
static equipPos: any = {
UNKNOW: 1,
USE: 2,
BAG: 3,
BANK: 4,
}
// 强杀等级限制
static PKLevelLimit = 90;
static petGrade: any = {
Normal: 0,
High: 1,
Special: 2,
Shen: 3,
SSR: 4,
}
static goldKind: any = {
Money: 0, // 银两
Jade: 1, // 仙玉
BindJade: 2, // 绑定仙玉
SLDH_Score: 3, // 水路大会积分
Goods: 4, // 道具
arena_Score: 5,//竞技场积分
bang_Score: 6,//帮贡
shi_Score: 7,//师贡
di_Score: 8,//地宫积分
xiu_Score: 9,//除魔积分
guo_Score: 10,//郭氏积分
}
static titleType: any = {
IMGTitle: 0, //图片类称谓
CommonTitle: 1, //普通文字称谓,如帮派类称谓
BroTitle: 2, //结拜类称谓
CoupleTitle: 3, //夫妻类称谓
}
static titleBangType: any = {
NoTitle: 0,
ShuiLuZhanShen: 86,
Shancaitongzi: 43,
Couple: 200,
Brother: 201,
BangZhu: 227, // 帮主
FuBangZhu: 226, // 副帮主
ZuoHuFa: 225, // 左护法
YouHuFa: 224, // 右护法
ZhangLao: 223, // 长老
TangZhu: 222, // 堂主
BangZhong: 221, // 帮众
}
static bangPost = {
Unknow: 0, // 未知
BangZhu: 1, // 帮主
FuBangZhu: 2, // 副帮主
ZuoHuFa: 3, // 左护法
YouHuFa: 4, // 右护法
ZhangLao: 5, // 长老
TangZhu: 6, // 堂主
BangZhong: 7, // 帮众
}
static relationType = {
Brother: 0, // 结拜
Couple: 1, // 结婚
}
static relationTypeMembersCount = {
[GameUtil.relationType.Brother]: 5,
[GameUtil.relationType.Couple]: 2,
}
static lingHouMinMoney = 2000;
static LingHouRetMoney = 10000;
static brotherMoney = 1000000;
static schemeUseMoney = 10000000;
static prop_data: any = {};
static catch_data: any = {};
static starList = [
10051,
10052,
10053,
10054,
10055,
10056,
10057,
10058,
10059,
10060,
10061,
10062,
];
static limitWordList: string[] = [
'系统',
'官方',
'测试',
'gm',
'Gm',
'GM',
'管理',
'内测',
'内部',
'技术',
'公告',
'公测',
'垃圾',
'毛泽东',
'周恩来',
'刘少奇',
'习近平',
'李克强',
'朱德',
'丁磊',
'你妈',
'买号',
'卖号',
'收号',
'出号',
'号',
'共产党'
]
static numchar: string[] = [
'q', 'Q', 'O', '', 'X', '微','员',
'一', '二', '三', '四', '五', '六', '七', '八', '九', '零', '',
'①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨',
'⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹',
'₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉',
'⑴', '⑵', '⑶', '⑷', '⑸', '⑹', '⑺', '⑻', '⑼',
'⒈', '⒉', '⒊', '⒋', '⒌', '⒍', '⒎', '⒏', '⒐',
'', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ',
'❶', '❷', '❸', '❹', '❺', '❻', '❼', '❽', '❾',
'➊', '➋', '➌', '➍', '➎', '➏', '➐', '➑', '➒', '➓',
'⓵', '⓶', '⓷', '⓸', '⓹', '⓺', '⓻', '⓼', '⓽','⑨','①','②','⑤','③','④','⑧',
'㈠', '㈡', '㈢', '㈣', '㈤', '㈥', '㈦', '㈧', '㈨',
'壹', '贰', '叁', '叄', '肆', '伍', '陆', '柒', '捌', '扒', '玖',
'伞', '溜', '君', '羊', '久', '巴',
'玉', '仙', '裙', '群', '西', '游','峮',
'1', '2', '3', '4', '5', '6', '7', '8', '9','无限钰','亲民服','新区峮','➀','➁','➂','➄','➃','➅','➆'
]
static fdump(obj: any) {
let t = 0;
let repeat = (str: any, n: any) => {
return new Array(n).join(str);
}
let adump = (object: any) => {
t++;
if (object && typeof object === "object") {
for (const key in object) {
if (object.hasOwnProperty(key)) {
const value = object[key];
if (value && typeof value === "object") {
let isa = Array.isArray(value);
console.log(repeat('\t', t), key + ':' + (isa ? '[' : '{'));
adump(value);
t--;
console.log(repeat('\t', t), isa ? ']' : '}');
} else {
console.log(repeat('\t', t), key + ':' + value);
}
}
}
} else {
console.log(repeat('\t', t), object);
}
}
adump(obj);
}
static dump(...args: any[]) {
for (const arg of args) {
this.fdump(arg);
}
}
static seed_index: number = 10000;
static buff_index: number = 10000;
static getAutoAddId(): number {
GameUtil.seed_index++;
return GameUtil.seed_index;
}
static getAutoBuffId(): number {
GameUtil.buff_index++;
return GameUtil.buff_index;
}
static random(min: number, max: number): number {
return Math.floor(Math.random() * (max - min + 1) + min);
}
static getFlag(nNum: number, nIndex: number): number {
if (nIndex < 0 || nIndex > 31)
return 0;
let nRet = (nNum >> nIndex) & 1;
return nRet;
}
static setFlag(nNum: any, nIndex: number, bValue: number): number {
if (nIndex < 0 || nIndex > 31)
return null;
if (bValue != 0 && bValue != 1)
return null;
let bFlag = GameUtil.getFlag(nNum, nIndex);
if (bFlag > bValue) {
nNum -= (1 << nIndex);
}
if (bFlag < bValue) {
nNum += (1 << nIndex);
}
return nNum;
}
static EPlayerFlag = {
EBanSpeak: 1,
}
static checkLimitWord = function (msg: any): boolean {
for (let k = 0; k < msg.length; k++) {
let msgchar: any = msg[k];
if (msgchar == "["){
return true;
}
if (GameUtil.numchar.indexOf(msgchar) != -1) {
return false;
}
}
for (let i = 0; i < GameUtil.limitBroadcastList.length; i++) {
const fword = GameUtil.limitBroadcastList[i];
let exp = "[" + fword.split('').join("].*[") + "]";
let reg = new RegExp(exp, 'im');
if (reg.test(msg)) {
return false;
}
}
return true;
}
static serverState: any = {
lower: 1, // 流畅
high: 2, // 拥堵
close: 3, // 关闭
}
static MonkeyPos: any = [
// 1007 大唐边境
{mapid: 1007, x: 133, y: 27},
{mapid: 1007, x: 21, y: 111},
{mapid: 1007, x: 76, y: 97},
{mapid: 1007, x: 5, y: 65},
{mapid: 1007, x: 165, y: 95},
// 1011 长安
{mapid: 1011, x: 256, y: 51},
{mapid: 1011, x: 71, y: 5},
{mapid: 1011, x: 253, y: 74},
{mapid: 1011, x: 176, y: 130},
{mapid: 1011, x: 73, y: 138},
{mapid: 1011, x: 106, y: 125},
{mapid: 1011, x: 7, y: 67},
{mapid: 1011, x: 32, y: 69},
{mapid: 1011, x: 2, y: 107},
{mapid: 1011, x: 28, y: 138},
// 1004 大唐境内
{mapid: 1004, x: 137, y: 90},
{mapid: 1004, x: 141, y: 22},
{mapid: 1004, x: 88, y: 6},
{mapid: 1004, x: 4, y: 74},
// 1010 东海渔村
{mapid: 1010, x: 115, y: 63},
{mapid: 1010, x: 52, y: 45},
{mapid: 1010, x: 113, y: 97},
{mapid: 1010, x: 75, y: 108},
{mapid: 1010, x: 24, y: 103},
{mapid: 1010, x: 94, y: 133},
// 1006 万寿山
{mapid: 1006, x: 80, y: 149},
{mapid: 1006, x: 84, y: 149},
{mapid: 1006, x: 88, y: 149},
{mapid: 1006, x: 92, y: 149},
{mapid: 1006, x: 96, y: 148},
{mapid: 1006, x: 96, y: 144},
{mapid: 1006, x: 91, y: 144},
{mapid: 1006, x: 84, y: 144},
{mapid: 1006, x: 78, y: 144},
{mapid: 1006, x: 66, y: 139},
{mapid: 1006, x: 72, y: 139},
{mapid: 1006, x: 76, y: 139},
{mapid: 1006, x: 82, y: 139},
{mapid: 1006, x: 66, y: 134},
{mapid: 1006, x: 75, y: 134},
{mapid: 1006, x: 86, y: 134},
{mapid: 1006, x: 92, y: 134},
{mapid: 1006, x: 15, y: 131},
{mapid: 1006, x: 9, y: 35},
// 1015 蟠桃园
{mapid: 1015, x: 41, y: 12},
{mapid: 1015, x: 5, y: 19},
{mapid: 1015, x: 76, y: 56},
{mapid: 1015, x: 102, y: 66},
{mapid: 1015, x: 43, y: 67},
{mapid: 1015, x: 9, y: 125},
{mapid: 1015, x: 4, y: 48},
// 1016 御马监
{mapid: 1016, x: 9, y: 16},
{mapid: 1016, x: 137, y: 40},
{mapid: 1016, x: 141, y: 65},
{mapid: 1016, x: 78, y: 90},
{mapid: 1016, x: 86, y: 34},
// 1014 灵兽村
{mapid: 1014, x: 8, y: 97},
{mapid: 1014, x: 2, y: 60},
{mapid: 1014, x: 148, y: 16},
{mapid: 1014, x: 140, y: 6},
{mapid: 1014, x: 88, y: 99},
// 1017 傲来国
{mapid: 1017, x: 8, y: 28},
{mapid: 1017, x: 8, y: 77},
{mapid: 1017, x: 10, y: 75},
{mapid: 1017, x: 1, y: 72},
{mapid: 1017, x: 34, y: 112},
{mapid: 1017, x: 32, y: 97},
{mapid: 1017, x: 100, y: 80},
{mapid: 1017, x: 56, y: 63},
{mapid: 1017, x: 68, y: 33},
{mapid: 1017, x: 9, y: 8},
{mapid: 1017, x: 27, y: 6},
{mapid: 1017, x: 43, y: 6},
{mapid: 1017, x: 59, y: 6},
{mapid: 1017, x: 113, y: 6},
{mapid: 1017, x: 142, y: 20},
{mapid: 1017, x: 97, y: 37},
{mapid: 1017, x: 137, y: 54},
// 1008 白骨山
{mapid: 1008, x: 105, y: 64},
{mapid: 1008, x: 10, y: 40},
{mapid: 1008, x: 48, y: 13},
// 1005 方寸山
{mapid: 1005, x: 14, y: 20},
{mapid: 1005, x: 49, y: 55},
{mapid: 1005, x: 59, y: 70},
// 1019 平顶山
{mapid: 1019, x: 182, y: 7},
{mapid: 1019, x: 121, y: 2},
{mapid: 1019, x: 147, y: 19},
{mapid: 1019, x: 178, y: 9},
{mapid: 1019, x: 15, y: 82},
{mapid: 1019, x: 2, y: 62},
{mapid: 1019, x: 2, y: 29},
{mapid: 1019, x: 29, y: 3},
{mapid: 1019, x: 47, y: 124},
{mapid: 1019, x: 191, y: 97},
{mapid: 1019, x: 191, y: 40},
{mapid: 1019, x: 175, y: 58},
{mapid: 1019, x: 177, y: 77},
{mapid: 1019, x: 146, y: 64},
// 1003 北俱芦洲
{mapid: 1003, x: 23, y: 69},
{mapid: 1003, x: 51, y: 74},
{mapid: 1003, x: 84, y: 6},
{mapid: 1003, x: 135, y: 22},
{mapid: 1003, x: 139, y: 5},
{mapid: 1003, x: 139, y: 45},
{mapid: 1003, x: 139, y: 62},
{mapid: 1003, x: 138, y: 80},
];
static require_ex(file: string): any {
if (GameUtil.prop_data[file]) {
return GameUtil.prop_data[file];
}
let data = GameUtil.reloadfile(file);
if (data == null) {
SKLogger.warn(`加载配置文件错误:${file}`);
} else {
GameUtil.prop_data[file] = data;
}
return data;
}
// 重新加载配置文件
static reloadPropData() {
let errorlist = [];
for (let filename in GameUtil.prop_data) {
let fieldata = GameUtil.reloadfile(filename);
if (fieldata) {
if (GameUtil.prop_data[filename]) {
let data = GameUtil.prop_data[filename];
for (const datakey in data) {
if (data.hasOwnProperty(datakey)) {
data[datakey] = fieldata[datakey];
}
}
} else {
GameUtil.prop_data[filename] = fieldata;
}
} else {
errorlist.push(filename);
}
}
SKLogger.info('热更新完成');
if (errorlist.length > 0) {
for (let filename of errorlist) {
SKLogger.warn(`文件加载错误:[${filename}]`);
}
}
return errorlist;
}
static reloadfile(filename: any): any {
let full_path = path.join(__dirname, filename);
let old = require.cache[require.resolve(full_path)];
if (old != null || old != undefined) {
GameUtil.catch_data[full_path] = old;
}
require.cache[require.resolve(full_path)] = undefined;
let ret_data = null;
try {
let data = require(require.resolve(full_path));
if (data) {
ret_data = data;
} else {
require.cache[full_path] = GameUtil.catch_data[full_path];
ret_data = null;
}
} catch (error) {
console.error('load json ERROR, filename:' + full_path);
console.error(error.message);
require.cache[full_path] = GameUtil.catch_data[full_path];
ret_data = null;
}
delete GameUtil.catch_data[full_path];
return ret_data;
}
static serviceType = {
Gate: 1,
Game: 2,
IM: 3,
}
static getPartnerJson(pPartner: any): string {
if (null == pPartner) {
return '{}';
}
let stLevelInfo = PartnerConfigMgr.shared.GetPower(pPartner.id, pPartner.relive, pPartner.level);
if (null == stLevelInfo)
return '{}';
let stData: any = {
id: pPartner.id,
level: pPartner.level,
exp: pPartner.exp,
resid: pPartner.resid,
name: pPartner.name,
race: pPartner.race,
dingwei: pPartner.dingwei,
relive: pPartner.relive,
mapZiZhi: pPartner.mapZiZhi,
skill_list: pPartner.skill_list,
livingtype: pPartner.living_type
};
for (var it2 in stLevelInfo.Attribute) {
stData[it2] = stLevelInfo.Attribute[it2];
}
let strJson = SKDataUtil.toJson(stData, "{}");
return strJson;
}
static getMapLen(mapTmp: any): number {
let nCnt = 0;
for (const it in mapTmp)
nCnt++;
return nCnt;
}
static numToString(nNum: number, nLen: number): string {
return (Array(nLen).join('0') + nNum).slice(-nLen);
}
static getTime() {
let nTime = Math.floor(Date.now() / 1000);
let nLocalTime = nTime + 28800;
return nLocalTime;
}
static changeNumToRange(fData: number, fMin: number, fMax: number): number {
fData = Math.max(fData, fMin);
fData = Math.min(fData, fMax);
return fData;
}
static isVectorEqual(vec1: any, vec2: any): boolean {
if (vec1.length != vec2.length)
return false;
for (var it in vec1) {
if (vec1[it] != vec2[it])
return false;
}
return true;
}
static isDataInVecter(stData: any, vecData: any): boolean {
for (let it in vecData) {
if (stData == vecData[it])
return true;
}
return false;
}
static getAttribute(stData: any, strKey: any, stDefault: any): any {
if (stData.hasOwnProperty(strKey) == false)
return stDefault;
return stData[strKey];
}
static getDistance(stPosA: any, stPosB: any): number {
let nXDis = Math.abs(stPosA.x - stPosB.x);
let nYDis = Math.abs(stPosA.y - stPosB.y);
let nDis = Math.pow(nXDis * nXDis + nYDis * nYDis, 0.5);
return nDis;
}
static getDefault(value: any, valid?: any): any {
if (typeof (value) == "undefined") {
return valid;
}
return value;
}
static atribKey_IntToString(nKey: any): any {
for (let it in GameUtil.attrEquipTypeStr) {
if (GameUtil.attrEquipTypeStr[it] == nKey)
return it;
}
return '';
}
static getMapDataByIndex(mapData: any, nIndex: number): any {
if (nIndex < 0 || nIndex >= this.getMapLen(mapData))
return null;
let nCnt = -1;
for (let it in mapData) {
nCnt++;
if (nCnt == nIndex)
return mapData[it];
}
return null;
}
static givePlayerPrize(player: Player, strItem: string, count: number, is: boolean = true) {
if (player == null)
return;
if (strItem == 'exp') {
player.addExp(count);
} else if (strItem == 'petexp') {
if (player.curPet) {
player.curPet.addExp(count);
}
} else if (strItem == 'money') {
player.addMoney(0, count, '高级藏宝图');
} else {
player.addItem(parseInt(strItem), count, is, '高级藏宝图');
}
}
static zhenbukuiMap: any = [
// 1007 大唐边境
//{ mapid: 1016, x: 75, y: 49 }, //测试用地点,在御马监小马仙附近
{mapid: 1007, x: 148, y: 44},
{mapid: 1007, x: 100, y: 24},
{mapid: 1007, x: 109, y: 5},
{mapid: 1007, x: 44, y: 14},
{mapid: 1007, x: 84, y: 104},
{mapid: 1007, x: 29, y: 83},
// 1011 长安
{mapid: 1011, x: 49, y: 36},
{mapid: 1011, x: 143, y: 66},
{mapid: 1011, x: 122, y: 34},
{mapid: 1011, x: 223, y: 34},
{mapid: 1011, x: 239, y: 113},
{mapid: 1011, x: 143, y: 84},
{mapid: 1011, x: 40, y: 9},
// 1004 大唐境内
{mapid: 1004, x: 124, y: 74},
{mapid: 1004, x: 120, y: 49},
{mapid: 1004, x: 119, y: 37},
{mapid: 1004, x: 38, y: 47},
{mapid: 1004, x: 70, y: 14},
// 1010 东海渔村
{mapid: 1010, x: 129, y: 47},
{mapid: 1010, x: 141, y: 34},
{mapid: 1010, x: 60, y: 22},
{mapid: 1010, x: 24, y: 9},
{mapid: 1010, x: 41, y: 53},
{mapid: 1010, x: 82, y: 89},
{mapid: 1010, x: 42, y: 103},
{mapid: 1010, x: 114, y: 114},
// 1006 万寿山
{mapid: 1006, x: 56, y: 73},
{mapid: 1006, x: 98, y: 48},
{mapid: 1006, x: 93, y: 8},
{mapid: 1006, x: 18, y: 30},
{mapid: 1006, x: 109, y: 94},
{mapid: 1006, x: 74, y: 136},
// 1015 蟠桃园
{mapid: 1015, x: 70, y: 30},
{mapid: 1015, x: 37, y: 26},
{mapid: 1015, x: 14, y: 57},
{mapid: 1015, x: 39, y: 76},
{mapid: 1015, x: 53, y: 103},
{mapid: 1015, x: 14, y: 120},
{mapid: 1015, x: 90, y: 58},
// 1016 御马监
{mapid: 1016, x: 34, y: 63},
{mapid: 1016, x: 112, y: 63},
{mapid: 1016, x: 96, y: 23},
{mapid: 1016, x: 68, y: 23},
{mapid: 1016, x: 37, y: 26},
// 1014 灵兽村
{mapid: 1014, x: 50, y: 36},
{mapid: 1014, x: 14, y: 55},
{mapid: 1014, x: 64, y: 58},
{mapid: 1014, x: 113, y: 64},
{mapid: 1014, x: 117, y: 42},
{mapid: 1014, x: 138, y: 12},
// 1017 傲来国
{mapid: 1017, x: 57, y: 11},
{mapid: 1017, x: 20, y: 10},
{mapid: 1017, x: 33, y: 42},
{mapid: 1017, x: 56, y: 64},
{mapid: 1017, x: 80, y: 71},
{mapid: 1017, x: 93, y: 90},
{mapid: 1017, x: 44, y: 103},
{mapid: 1017, x: 12, y: 74},
{mapid: 1017, x: 98, y: 29},
{mapid: 1017, x: 133, y: 51},
// 1008 白骨山
{mapid: 1008, x: 80, y: 13},
{mapid: 1008, x: 79, y: 52},
{mapid: 1008, x: 57, y: 70},
{mapid: 1008, x: 36, y: 70},
{mapid: 1008, x: 30, y: 10},
// 1005 方寸山
{mapid: 1005, x: 34, y: 22},
{mapid: 1005, x: 24, y: 65},
{mapid: 1005, x: 48, y: 48},
{mapid: 1005, x: 68, y: 78},
{mapid: 1005, x: 94, y: 89},
{mapid: 1005, x: 101, y: 28},
// 1019 平顶山
{mapid: 1019, x: 154, y: 91},
{mapid: 1019, x: 112, y: 104},
{mapid: 1019, x: 101, y: 60},
{mapid: 1019, x: 78, y: 39},
{mapid: 1019, x: 28, y: 22},
{mapid: 1019, x: 32, y: 55},
{mapid: 1019, x: 110, y: 17},
// 1003 北俱芦洲
{mapid: 1003, x: 24, y: 37},
{mapid: 1003, x: 61, y: 42},
{mapid: 1003, x: 102, y: 48},
{mapid: 1003, x: 120, y: 17},
{mapid: 1003, x: 87, y: 23},
];
static attrTypeL1Name: any = {
// 抗控制
[EAttrTypeL1.K_CONFUSION]: '抗混乱',
[EAttrTypeL1.K_SEAL]: '抗封印',
[EAttrTypeL1.K_SLEEP]: '抗昏睡',
[EAttrTypeL1.K_FORGET]: '抗遗忘',
// 法术抗性
[EAttrTypeL1.K_WIND]: '抗风',
[EAttrTypeL1.K_THUNDER]: '抗雷',
[EAttrTypeL1.K_WATER]: '抗水',
[EAttrTypeL1.K_FIRE]: '抗火',
[EAttrTypeL1.K_WILDFIRE]: '抗鬼火',
[EAttrTypeL1.K_BLOODRETURN]: '抗三尸',
[EAttrTypeL1.K_POISON]: '抗毒',
[EAttrTypeL1.K_DETER]: '抗震慑',
// 忽视抗性(强法)
[EAttrTypeL1.HK_SEAL]: '忽视抗封印',
[EAttrTypeL1.HK_CONFUSION]: '忽视抗混乱',
[EAttrTypeL1.HK_SLEEP]: '忽视抗昏睡',
[EAttrTypeL1.HK_FORGET]: '忽视抗遗忘',
[EAttrTypeL1.HK_WIND]: '忽视抗风',
[EAttrTypeL1.HK_THUNDER]: '忽视抗雷',
[EAttrTypeL1.HK_WATER]: '忽视抗水',
[EAttrTypeL1.HK_FIRE]: '忽视抗火',
[EAttrTypeL1.HK_WILDFIRE]: '忽视抗鬼火',
[EAttrTypeL1.HK_BLOODRETURN]: '忽视抗三尸',
[EAttrTypeL1.HK_POISON]: '忽视抗毒',
[EAttrTypeL1.HK_DETER]: '忽视抗震慑',
[EAttrTypeL1.K_PHY_GET]: '抗物理',
[EAttrTypeL1.HK_PHY_GET]: '忽视抗物理',
// 物理属性
[EAttrTypeL1.PHY_GET]: '物理吸收',
[EAttrTypeL1.PHY_BREAK]: '破防程度',
[EAttrTypeL1.PHY_BREAK_PROB]: '破防率',
[EAttrTypeL1.PHY_HIT]: '命中率',
[EAttrTypeL1.PHY_DODGE]: '闪躲率',
[EAttrTypeL1.PHY_COMBO]: '连击',
[EAttrTypeL1.PHY_COMBO_PROB]: '连击率',
[EAttrTypeL1.PHY_DEADLY]: '狂暴',
// 法术也会反震
[EAttrTypeL1.PHY_REBOUND]: '反震程度',
[EAttrTypeL1.PHY_REBOUND_PROB]: '反震率',
[EAttrTypeL1.DEFEND_ADD]: '加强防御',
[EAttrTypeL1.SPD_ADD]: '加速',
[EAttrTypeL1.ATK_ADD]: '加攻',
[EAttrTypeL1.HP_ADD]: '加血',
[EAttrTypeL1.MP_ADD]: '加法',
[EAttrTypeL1.CHARM_ADD]: '加强魅惑',
[EAttrTypeL1.HP_MAX]: '增加气血上限',
[EAttrTypeL1.MP_MAX]: '增加法力上限',
[EAttrTypeL1.ATK]: '攻击',
[EAttrTypeL1.SPD]: '速度',
[EAttrTypeL1.HP]: '气血',
[EAttrTypeL1.MP]: '法力',
[EAttrTypeL1.CURE_EHAN]: '加强治愈',
[EAttrTypeL1.SWEEP_EHAN]: '加强横扫',
[EAttrTypeL1.BREAK_EHAN]: '加强破甲',
[EAttrTypeL1.THUD_EHAN]: '加强震击',
[EAttrTypeL1.HP_PERC]: '气血百分比',
[EAttrTypeL1.MP_PERC]: '法力百分比',
[EAttrTypeL1.ATK_PERC]: '攻击百分比',
[EAttrTypeL1.SPD_PERC]: '速度百分比',
[EAttrTypeL1.KB_WATER]: '水系狂暴率',
[EAttrTypeL1.KB_THUNDER]: '雷系狂暴率',
[EAttrTypeL1.KB_FIRE]: '火系狂暴率',
[EAttrTypeL1.KB_WIND]: '风系狂暴率',
[EAttrTypeL1.KB_BLOODRETURN]: '三尸狂暴率',
[EAttrTypeL1.KB_WILDFIRE]: '鬼火狂暴率',
[EAttrTypeL1.Q_WATER]: '水狂暴',
[EAttrTypeL1.Q_THUNDER]: '雷狂暴',
[EAttrTypeL1.Q_FIRE]: '火狂暴',
[EAttrTypeL1.Q_WIND]: '风狂暴',
[EAttrTypeL1.Q_BLOODRETURN]: '三尸狂暴',
[EAttrTypeL1.Q_WILDFIRE]: '鬼火狂暴',
// 五行(百分比值)(只有宝宝出生有五行,人使用道具改变五行值,法术改变五行值)
[EAttrTypeL1.GOLD]: '金',
[EAttrTypeL1.WOOD]: '木',
[EAttrTypeL1.WATER]: '水',
[EAttrTypeL1.FIRE]: '火',
[EAttrTypeL1.SOIL]: '土',
// 强力克五行
[EAttrTypeL1.S_GOLD]: '强力克金',
[EAttrTypeL1.S_WOOD]: '强力克木',
[EAttrTypeL1.S_WATER]: '强力克水',
[EAttrTypeL1.S_FIRE]: '强力克火',
[EAttrTypeL1.S_SOIL]: '强力克土',
[EAttrTypeL1.SLEEP_EHAN]: '加强昏睡',
[EAttrTypeL1.DETER_EHAN]: '加强震慑',
[EAttrTypeL1.WILDFIRE]: '加强鬼火',
[EAttrTypeL1.TOXIN_EHAN]: '加强毒',
[EAttrTypeL1.SPD_ADD_EHAN]: '加强加速',
[EAttrTypeL1.DEFEND_ADD_EHAN]: '加强加防',
[EAttrTypeL1.BLOODRETURN_EHAN]: '加强三尸',
[EAttrTypeL1.ICE_EHAN]: '加强冰',
[EAttrTypeL1.SEAL_EHAN]: '加强封印',
[EAttrTypeL1.CHAOS_EHAN]: '加强混乱',
[EAttrTypeL1.WIND_EHAN]: '加强风',
[EAttrTypeL1.FIRE_EHAN]: '加强火',
[EAttrTypeL1.WATER_EHAN]: '加强水',
[EAttrTypeL1.THUNDER_EHAN]: '加强雷',
[EAttrTypeL1.FORGET_EHAN]: '加强遗忘',
[EAttrTypeL1.BONE]: '根骨',
[EAttrTypeL1.SPIRIT]: '灵性',
[EAttrTypeL1.STRENGTH]: '力量',
[EAttrTypeL1.DEXTERITY]: '敏捷',
};
// 属性2名称
static attrTypeL2Name: any = {
[EAttrTypeL2.GENGU]: '根骨',
[EAttrTypeL2.LINGXING]: '灵性',
[EAttrTypeL2.LILIANG]: '力量',
[EAttrTypeL2.MINJIE]: '敏捷',
}
static launch() {
// SKRedisUtil.launch();
this.snowFlake53 = new SnowFlack53(BigInt(this.serverId - 1000 + 1));
this.game_conf = SKDataUtil.readJson("../../conf/json/game_conf.json");
SKLogger.isDebug = GameConf.isDebug;
SKLogger.info(`[${GameConf.channel}:${SKLogger.isDebug ? `调试` : `正式`}]读取游戏全局配置完成!`);
}
static getReliveText(relive: number, level: number): string {
let prefix = "";
if (relive > 3) {
prefix = "飞升";
} else {
prefix = `${relive}`;
}
let result = `${prefix}${level}`;
return result;
}
static sex: any = ["未知","男","女"];
static race: any = ["未知","人","仙","魔","鬼","龙"];
static getRoleRaceText(race: number, sex: number): string {
return GameUtil.race[race] + GameUtil.sex[sex];
}
static getRandomArrayElements(arr: any, count: number) {
let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
while (i-- > min) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(min);
}
/**
*
* @param race
* @param equip
*/
static getEquipScore(baseAttr: any, lianhuaAttr: any, type: number, grade: number, sex: number, race: number, baseScore: number, gemCnt: any): number {
let score = 0;
// 佩饰
if (type == EEquipType.BALDRIC) {
score = this.getBasicsListAttrScore(race, sex, baseAttr);
score += baseScore + baseScore * 0.5 * grade;
}
// 翅膀 或 仙器 或 神器 或 高级装备 或 新手装备
else if (type == EEquipType.WING || type == EEquipType.XianQi || type == EEquipType.ShenBing || type == EEquipType.HIGH || type == EEquipType.XinShou) {
// 宝石评分
if (JSON.stringify(gemCnt) != '{}'){
score += this.gemCalculate(gemCnt);
}
// 炼化评分
if (JSON.stringify(lianhuaAttr) != '{}'){
score += this.getBasicsListAttrScore(race, sex, lianhuaAttr);
}
score += this.calculate(baseAttr,race, sex, true);
score += baseScore + baseScore * 0.5 * grade;
}
// 其他装备
else {
score += baseScore + baseScore * 0.5 * grade;
}
if (isNaN(score)){
score = 0;
}
return Math.floor(score);
}
// 数组对象类型属性评分计算[{}]
static getBasicsListAttrScore(race: number, sex: number, baseAttr: any): number {
let score = 0;
// 查看当前属性是否有值
if (baseAttr.length > 0) {
// 有值则遍历取值
for (let base of baseAttr) {
// 计算属性值
score += this.calculate(base,race,sex,false);
}
}
return Math.floor(score);
}
// 计算属性值
static calculate(base: any, race: number, sex: number,flag :boolean): number{
let score = 0;
// 当前属性
for (let key in base) {
let key_ = parseInt(key);
let value = parseInt(base[key]);
// 判断当前属性值是否不用计算百分百比
if (this.equipTypeNumerical.indexOf(key_) != -1) {
value = value / 100;
}else {
if (flag){
value = value / 10;
}
}
// 获取装备属性每点分数
let grade = this.getScore(race, sex, key_);
score += value * grade;
}
return Math.floor(score);
}
// 计算宝石属性评分
static gemCalculate(gemCnt: any): number{
let score = 0;
for (let key in gemCnt) {
// 宝石编号
let key_ = parseInt(key);
// 镶嵌数量
let value = parseInt(gemCnt[key]);
// 根据宝石编号获取当前宝石单个分数
let grade = this.gemBasicsScore[key_];
score += grade * value;
}
return Math.floor(score);
}
// 角色属性分数15分 通用属性忽视抗抗连击率10分 角色基础属性分数5分
static getScore(race: number, sex: number, key: number): number {
let grade = 5;
let roleAttrScore: any = this.roleAttrScore[race];
// 判断是否为通用装备
if (roleAttrScore != undefined) {
if (sex != 9) {
let value = roleAttrScore[sex][key];
if (value == undefined) {
value = this.roleBasicsAttrScore[key];
if (value != undefined) {
grade = 10;
}
} else {
grade = value;
}
} else {
grade = 5;
}
} else {
let value = this.roleBasicsAttrScore[key];
if (value != undefined) {
grade = 10;
}
}
return grade;
}
// 角色基础属性分数
static roleBasicsAttrScore: any = {
[EAttrTypeL2.GENGU]: 5,
[EAttrTypeL2.LINGXING]: 5,
[EAttrTypeL2.LILIANG]: 5,
[EAttrTypeL2.MINJIE]: 5,
}
// 角色属性分数
static roleAttrScore: any = {
[ERaceType.HUMEN]: {
// 人族 (男)
[ESexType.MALE]: {
// key 属性, value 每点属性分数
[EAttrTypeL1.K_SEAL_CONFUSION_SLEEP_FORGET_LIMIT]: 15,
[EAttrTypeL1.HK_CONFUSION]: 15,
[EAttrTypeL1.HK_SEAL]: 15,
[EAttrTypeL1.HK_SLEEP]: 15,
},
// 人族 (女)
[ESexType.FEMALE]: {
// key 属性, value 每点属性分数
[EAttrTypeL1.HK_POISON]: 15,
[EAttrTypeL1.BONE]: 15,
},
},
[ERaceType.SKY]: {
// 仙族 (男)
[ESexType.MALE]: {
// key 属性, value 每点属性分数
[EAttrTypeL1.SPIRIT]: 15,
[EAttrTypeL1.Q_WIND]: 15,
[EAttrTypeL1.Q_FIRE]: 15,
[EAttrTypeL1.Q_WATER]: 15,
[EAttrTypeL1.Q_THUNDER]: 15,
[EAttrTypeL1.KB_WIND]: 15,
[EAttrTypeL1.KB_FIRE]: 15,
[EAttrTypeL1.KB_WATER]: 15,
[EAttrTypeL1.KB_THUNDER]: 15,
[EAttrTypeL1.HK_WIND]: 15,
[EAttrTypeL1.HK_FIRE]: 15,
[EAttrTypeL1.HK_WATER]: 15,
[EAttrTypeL1.HK_THUNDER]: 15,
},
// 仙族 (女)
[ESexType.FEMALE]: {
// key 属性, value 每点属性分数
[EAttrTypeL1.SPIRIT]: 15,
[EAttrTypeL1.Q_WIND]: 15,
[EAttrTypeL1.Q_FIRE]: 15,
[EAttrTypeL1.Q_WATER]: 15,
[EAttrTypeL1.Q_THUNDER]: 15,
[EAttrTypeL1.KB_WIND]: 15,
[EAttrTypeL1.KB_FIRE]: 15,
[EAttrTypeL1.KB_WATER]: 15,
[EAttrTypeL1.KB_THUNDER]: 15,
[EAttrTypeL1.HK_WIND]: 15,
[EAttrTypeL1.HK_FIRE]: 15,
[EAttrTypeL1.HK_WATER]: 15,
[EAttrTypeL1.HK_THUNDER]: 15,
},
},
[ERaceType.DEMON]: {
// 魔族 (男)
[ESexType.MALE]: {
[EAttrTypeL1.Q_BLOODRETURN]: 15,
[EAttrTypeL1.KB_BLOODRETURN]: 15,
[EAttrTypeL1.HK_BLOODRETURN]: 15,
[EAttrTypeL1.HK_DETER]: 15,
},
// 魔族 (女)
[ESexType.FEMALE]: {
[EAttrTypeL1.Q_BLOODRETURN]: 15,
[EAttrTypeL1.KB_BLOODRETURN]: 15,
[EAttrTypeL1.HK_BLOODRETURN]: 15,
[EAttrTypeL1.HK_DETER]: 15,
},
},
[ERaceType.GHOST]: {
// 鬼族 (男)
[ESexType.MALE]: {
[EAttrTypeL1.HK_WILDFIRE]: 15,
[EAttrTypeL1.KB_WILDFIRE]: 15,
[EAttrTypeL1.Q_WILDFIRE]: 15,
},
// 鬼族 (女)
[ESexType.FEMALE]: {
[EAttrTypeL1.HK_WILDFIRE]: 15,
[EAttrTypeL1.KB_WILDFIRE]: 15,
[EAttrTypeL1.Q_WILDFIRE]: 15,
},
},
}
// 宝石分数
static gemBasicsScore: any = {
// 红宝石基础分数: 70分 每增加一个等级增加5分
30025: 70,
30026: 75,
30027: 80,
30028: 85,
30029: 90,
30030: 95,
30104: 100,
// 绿宝石基础分数: 65分 每增加一个等级增加5分
30013: 65,
30014: 70,
30015: 75,
30016: 80,
30017: 85,
30018: 90,
30102: 95,
// 蓝宝石基础分数: 65分 每增加一个等级增加5分
30019: 65,
30020: 70,
30021: 75,
30022: 80,
30023: 85,
30024: 90,
30103: 95,
// 紫宝石基础分数: 65分 每增加一个等级增加5分
30001: 65,
30002: 70,
30003: 75,
30004: 80,
30005: 85,
30006: 90,
30100: 95,
// 橙宝石基础分数: 65分 每增加一个等级增加5分
30007: 65,
30008: 70,
30009: 75,
30010: 80,
30011: 85,
30012: 90,
30101: 95,
}
// Map转数组
static mapToArray(entries: any, size: number) {
let list = [];
for (let i = 0; i < size; i++) {
let data = entries.next().value;
list.push(data[1])
}
return list;
};
// 清空属性表
static clearAllAttr(attr1: { [key: string]: number }) {
for (let key in EAttrTypeL1) {
let value = SKDataUtil.numberBy(key);
if (isNaN(value)) {
continue;
}
attr1[value] = 0;
}
}
/**
*
* flag: 012
*/
static getDaySignIn(): any{
let data: any = {};
// 当前月天数
let day = GTimer.getMonthDay();
// 当前月份
let month = GTimer.getCurMonth();
let list: any = [];
for (let i = 0; i < day; i++) {
list.push({day: i + 1, flag: 0})
}
data[month] = list;
return SKDataUtil.toJson(data,"{}");
}
//阿拉伯数字转中文数字
noToChinese(num: any) {
if (!/^\d*(\.\d*)?$/.test(num)) {
alert("Number is wrong!");
return "Number is wrong!";
}
let AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");
let BB = new Array("", "十", "百", "千", "万", "亿", "点", "");
let a: any = ("" + num).replace(/(^0*)/g, "").split("."),
k = 0,
re = "";
for (let i = a[0].length - 1; i >= 0; i--) {
switch (k) {
case 0:
re = BB[7] + re;
break;
case 4:
if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
re = BB[4] + re;
break;
case 8:
re = BB[5] + re;
BB[7] = BB[5];
k = 0;
break;
}
if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re;
if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re;
k++;
}
if (a.length > 1) //加上小数部分(如果有小数部分)
{
re += BB[6];
for (let i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
}
return re;
};
static getIPAdress(): string {
var interfaces = os.networkInterfaces();
for (var devName in interfaces) {
var iface = interfaces[devName];
for (var i = 0; i < iface.length; i++) {
var alias = iface[i];
if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
return alias.address;
}
}
}
return "127.0.0.1";
}
static nextId(): number {
if (this.snowFlake53 == null) {
throw new Error("服务器没有正常启动!");
}
return this.snowFlake53.nextId();
}
}