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

2372 lines
82 KiB
TypeScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 * 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: 0未签到、1签到、2补签
*/
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();
}
}