XmdsPlayerUtil.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using XmdsCommon.Plugin;
  7. using CommonLang.Log;
  8. using XmdsCommon.EditorData;
  9. using CommonAI.Zone.Helper;
  10. using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
  11. using CommonAI.Data;
  12. namespace XmdsServerEdgeJS
  13. {
  14. public class XmdsPlayerUtil
  15. {
  16. public class UnitSkillData
  17. {
  18. public XmdsUnitSkillInfo normalSkill = new XmdsUnitSkillInfo();
  19. public XmdsUnitSkillInfo cardSkill = new XmdsUnitSkillInfo();
  20. }
  21. private readonly Logger log = LoggerFactory.GetLogger("XmdsPlayer");
  22. private static XmdsPlayerUtil _instance;
  23. /// 单件实例
  24. public static XmdsPlayerUtil instance()
  25. {
  26. if (_instance == null)
  27. {
  28. _instance = new XmdsPlayerUtil();
  29. }
  30. return _instance;
  31. }
  32. public static void instance(XmdsPlayerUtil value)
  33. {
  34. _instance = value;
  35. }
  36. public XmdsUnitData createXmdsUnitData(dynamic input, string playerId)
  37. {
  38. try
  39. {
  40. XmdsUnitData data = new XmdsUnitData();
  41. data.BaseInfo = createXmdsUnitBaseInfo(input.basic);
  42. data.UnitPKInfo = createXmdsPKInfo(input.pkInfo);
  43. data.AvatarList = createXmdsAvatarInfoList(input.avatars);
  44. data.Prop = createXmdsUnitProp(input.effects, playerId);
  45. data.Prop.HP = (int)input.tempData.hp;
  46. if(data.Prop.HP <= 0)
  47. {
  48. log.Error("单位血量为负值:" + data.Prop.HP);
  49. //防止异常
  50. data.Prop.HP = 1;
  51. }
  52. data.PropExt = createXmdsUnitProp(input.effectsExt, playerId);
  53. UnitSkillData skillData = createXmdsUnitSkillInfo(input.skills);
  54. data.Skills = skillData.normalSkill;
  55. data.CardSkills = skillData.cardSkill;
  56. int addTestPetData = (int)input.addTestPetData;
  57. if (addTestPetData == 1)
  58. {
  59. data.UnitPetData = createPetData(input.petBase, input.petEffect, input.petSkill, input.petMode);
  60. }
  61. data.UnitSceneInfo = createSceneInfo(input.sceneData);
  62. return data;
  63. }
  64. catch (Exception err)
  65. {
  66. log.Error("createXmdsUnitData error: " + err.Message, err);
  67. return null;
  68. }
  69. }
  70. public SceneInfo createSceneInfo(dynamic sceneData)
  71. {
  72. try
  73. {
  74. int allowAutoGuard = (int)sceneData.allowAutoGuard;
  75. SceneInfo sceneInfo = new SceneInfo();
  76. sceneInfo.AllowAutoGuard = true;
  77. if (allowAutoGuard == 1)
  78. {
  79. sceneInfo.AllowAutoGuard = false;
  80. }
  81. return sceneInfo;
  82. }
  83. catch (Exception err)
  84. {
  85. log.Error("createPetConfig error: " + err.Message, err);
  86. return null;
  87. }
  88. }
  89. public PetData createPetData(dynamic petBase, dynamic petEffect, dynamic petSkill, dynamic petMode)
  90. {
  91. try
  92. {
  93. PetData petData = new PetData();
  94. PetBaseInfo baseInfo = createPetBaseData(petBase);
  95. petData.BaseInfo = baseInfo;
  96. XmdsUnitProp unitProp = createXmdsUnitProp(petEffect, "");
  97. petData.UnitProp = unitProp;
  98. UnitSkillData skillData = createXmdsUnitSkillInfo(petSkill);
  99. XmdsUnitSkillInfo skillInfo = skillData.normalSkill;
  100. petData.SkillInfo = skillInfo;
  101. XmdsPetConifg petConfigInfo = createPetConfig(petMode);
  102. petData.PetConfig = petConfigInfo;
  103. return petData;
  104. }
  105. catch (Exception err)
  106. {
  107. log.Error("createPetData error: " + err.Message, err);
  108. return null;
  109. }
  110. }
  111. public XmdsPetConifg createPetConfig(dynamic petMode)
  112. {
  113. try
  114. {
  115. XmdsPetConifg petConfigInfo = new XmdsPetConifg();
  116. petConfigInfo.Mode = (XmdsPetConifg.XmdsPetFollowMode)petMode;
  117. return petConfigInfo;
  118. }
  119. catch (Exception err)
  120. {
  121. log.Error("createPetConfig error: " + err.Message, err);
  122. return null;
  123. }
  124. }
  125. public PetBaseInfo createPetBaseData(dynamic petBase)
  126. {
  127. try
  128. {
  129. PetBaseInfo baseInfo = new PetBaseInfo();
  130. baseInfo.AvatarModel = (string)petBase.Model;
  131. baseInfo.AvatarModelScale = (int)petBase.ModelPercent;
  132. baseInfo.EffectModel = (string)petBase.ModelStar;
  133. baseInfo.EffectScale = (int)petBase.ModelStarPercent;
  134. baseInfo.EffectSceneScale = (int)petBase.ModelStarScenePercent;
  135. baseInfo.level = (int)petBase.level;
  136. baseInfo.name = (string)petBase.name;
  137. baseInfo.QColor = (byte)petBase.Qcolor;
  138. baseInfo.TemplateID = (int)petBase.templateId;
  139. baseInfo.IconName = (string)petBase.Icon;
  140. baseInfo.StateLv = (byte)petBase.upGradeLevel;
  141. return baseInfo;
  142. }
  143. catch (Exception err)
  144. {
  145. log.Error("createPetBaseData error: " + err.Message, err);
  146. return null;
  147. }
  148. }
  149. public PKInfo createXmdsPKInfo(dynamic input)
  150. {
  151. try
  152. {
  153. PKInfo pkInfo = new PKInfo();
  154. pkInfo.CurPKMode = (PKMode)input.mode;
  155. pkInfo.CurPKValue = (int)input.value;
  156. pkInfo.CurPKLevel = (PKLevel)input.level;
  157. return pkInfo;
  158. }
  159. catch (Exception err)
  160. {
  161. log.Error("createXmdsPKInfo error: " + err.Message, err);
  162. return null;
  163. }
  164. }
  165. public XmdsUnitBaseInfo createXmdsUnitBaseInfo(dynamic input)
  166. {
  167. XmdsUnitBaseInfo baseInfo = new XmdsUnitBaseInfo();
  168. baseInfo.name = (string)input.name;
  169. baseInfo.force = input.force;
  170. baseInfo.alliesForce = input.alliesForce;
  171. baseInfo.GuildID = (string)input.guildId;
  172. baseInfo.GuildName = (string)input.guildName;
  173. baseInfo.ProType = (CommonAI.Data.XmdsUnitPro)input.pro;
  174. baseInfo.ServerID = (int)input.serverId;
  175. baseInfo.TitleID = (int)input.titleId;
  176. baseInfo.UnitLv = (int)input.level;
  177. baseInfo.VIPLv = (int)input.vip;
  178. baseInfo.StateLv = (byte)input.upLevel;
  179. int beReward = (int)input.beReward;
  180. baseInfo.SPState = (CommonAI.XmdsConstConfig.SpecialState)beReward;
  181. baseInfo.logicServerId = (int)input.logicServerId;
  182. baseInfo.sex = (byte)input.sex;
  183. baseInfo.uuid = input.uuid;
  184. baseInfo.potionAddition = ((float)input.potionAddition) / 10000;
  185. return baseInfo;
  186. }
  187. public List<XmdsAvatarInfo> createXmdsAvatarInfoList(dynamic input)
  188. {
  189. try
  190. {
  191. List<XmdsAvatarInfo> prop = new List<XmdsAvatarInfo>();
  192. foreach (dynamic obj in input)
  193. {
  194. XmdsAvatarInfo avatar = new XmdsAvatarInfo();
  195. avatar.PartTag = (XmdsAvatarInfo.XmdsAvatar)obj.tag;
  196. avatar.FileName = (string)obj.fileName;
  197. avatar.EffectType = (byte)obj.effectType;
  198. prop.Add(avatar);
  199. }
  200. return prop;
  201. }
  202. catch (Exception err)
  203. {
  204. log.Error("createXmdsAvatarInfoList error: " + err.Message, err);
  205. return null;
  206. }
  207. }
  208. /*注意,该接口为玩家和宠物公用,单方新增字段需加判断,否则会报错(如下:bagRemainCount和teamBagRemainCount字段)*/
  209. public XmdsUnitProp createXmdsUnitProp(dynamic input, string playerId)
  210. {
  211. try
  212. {
  213. XmdsUnitProp prop = new XmdsUnitProp();
  214. //生命
  215. prop.BaseMaxHP = (input.MaxHP != null) ? (int)input.MaxHP : 0;
  216. prop.HPPer = (input.HPPer != null) ? (int)input.HPPer : 0;
  217. prop.HP = (input.HP != null) ? (int)input.HP : prop.BaseMaxHP;
  218. //攻击
  219. prop.BaseAttack = (input.Attack != null) ? (int)input.Attack : 0;
  220. prop.AttackPer = (input.AttackPer != null) ? (int)input.AttackPer : 0;
  221. //防御
  222. prop.BaseDefence = (input.Def != null) ? (int)input.Def : 0;
  223. prop.DefencePer = (input.DefPer != null) ? (int)input.DefPer : 0;
  224. //无视防御
  225. prop.BaseIgnoreDefense = (input.IgnoreDefense != null) ? (int)input.IgnoreDefense : 0;
  226. prop.IgnoreDefensePer = (input.IgnoreDefensePer != null) ? (int)input.IgnoreDefensePer : 0;
  227. //暴击
  228. prop.CritRate = (input.CritRate != null) ? (int)input.CritRate : 0;
  229. prop.BaseResCrit = (input.Rescrit != null) ? (int)input.Rescrit : 0;
  230. prop.ResCritPer = (input.ResCritPer != null) ? (int)input.ResCritPer : 0;
  231. prop.ResCritRate = (input.ResCritRate != null) ? (int)input.ResCritRate : 0;
  232. prop.CritDamage = (input.CritDamage != null) ? (int)input.CritDamage : 0;
  233. prop.CritDamageRes = (input.CritDamageRes != null) ? (int)input.CritDamageRes : 0;
  234. //伤害整体
  235. prop.PlayerDamageAdd = (input.IncAllDamage != null) ? (int)input.IncAllDamage : 0;
  236. prop.PlayerDamageReduce = (input.AllDamageReduce != null) ? (int)input.AllDamageReduce : 0;
  237. prop.CtrlTimeReduce = (input.CtrlTimeReduce != null) ? (int)input.CtrlTimeReduce : 0;
  238. prop.SkillCD = (input.SkillCD != null) ? (int)input.SkillCD : 0;
  239. prop.HPReborn = (input.HPRegen != null) ? (int)input.HPRegen : 0;
  240. prop.HPRecoverPer = (input.HPRecoverPer != null) ? (int)input.HPRecoverPer : 0;
  241. prop.HealEffect = (input.HealEffect != null) ? (int)input.HealEffect : 0;
  242. prop.HealedEffect = (input.HealedEffect != null) ? (int)input.HealedEffect : 0;
  243. prop.MoveSpeed = (input.MoveSpeed != null) ? (float)input.MoveSpeed : 0;
  244. if (prop.MoveSpeed != 0 && (prop.MoveSpeed > 100 || prop.MoveSpeed < 2))
  245. {
  246. log.Warn("玩家/宠物移速确定是认真的? : " + prop.MoveSpeed + ", " + playerId);
  247. }
  248. prop.VelocityAddition = (input.RunSpeed != null) ? (int)input.RunSpeed : 0;
  249. prop.CurInventorySize = (input.bagRemainCount != null) ? (int)input.bagRemainCount : 0;
  250. prop.CurTeamInventorySize = (input.teamBagRemainCount != null) ? (int)input.teamBagRemainCount : 0;
  251. //2019.7.10新增属性
  252. prop.SkillDamageAdd = (input.SkillDamage != null) ? (int)input.SkillDamage : 0;
  253. prop.AttackSpeed = (input.AttackSpeed != null) ? (int)input.AttackSpeed : 0;
  254. prop.ControlUp = (input.ControlUp != null) ? (int)input.ControlUp : 0;
  255. //if (prop.AttackSpeed != 0 && (prop.AttackSpeed > 100000 || prop.AttackSpeed < 1000))
  256. //{
  257. // log.Warn("玩家/宠物攻速确定是认真的? : " + prop.AttackSpeed);
  258. // prop.AttackSpeed = 10000;
  259. //}
  260. //元素攻击 & 防御
  261. prop.ArtifactAttack[(int)ArtifactType.Gold] = (input.GoldAttack != null) ? (int)input.GoldAttack : 0;
  262. prop.ArtifactAttack[(int)ArtifactType.Wood] = (input.WoodAttack != null) ? (int)input.WoodAttack : 0;
  263. prop.ArtifactAttack[(int)ArtifactType.Water] = (input.WaterAttack != null) ? (int)input.WaterAttack : 0;
  264. prop.ArtifactAttack[(int)ArtifactType.Fire] = (input.FireAttack != null) ? (int)input.FireAttack : 0;
  265. prop.ArtifactAttack[(int)ArtifactType.Soil] = (input.SoilAttack != null) ? (int)input.SoilAttack : 0;
  266. prop.ArtifactDefense[(int)ArtifactType.Gold] = (input.GoldDefense != null) ? (int)input.GoldDefense : 0;
  267. prop.ArtifactDefense[(int)ArtifactType.Wood] = (input.WoodDefense != null) ? (int)input.WoodDefense : 0;
  268. prop.ArtifactDefense[(int)ArtifactType.Water] = (input.WaterDefense != null) ? (int)input.WaterDefense : 0;
  269. prop.ArtifactDefense[(int)ArtifactType.Fire] = (input.FireDefense != null) ? (int)input.FireDefense : 0;
  270. prop.ArtifactDefense[(int)ArtifactType.Soil] = (input.SoilDefense != null) ? (int)input.SoilDefense : 0;
  271. //元素克制 & 抵御
  272. prop.ArtifactRestraint[(int)ArtifactType.Gold] = (input.GoldRestraint != null) ? (int)input.GoldRestraint : 0;
  273. prop.ArtifactRestraint[(int)ArtifactType.Wood] = (input.WoodRestraint != null) ? (int)input.WoodRestraint : 0;
  274. prop.ArtifactRestraint[(int)ArtifactType.Water] = (input.WaterRestraint != null) ? (int)input.WaterRestraint : 0;
  275. prop.ArtifactRestraint[(int)ArtifactType.Fire] = (input.FireRestraint != null) ? (int)input.FireRestraint : 0;
  276. prop.ArtifactRestraint[(int)ArtifactType.Soil] = (input.SioilRestraint != null) ? (int)input.SoilRestraint : 0;
  277. prop.ArtifactResist[(int)ArtifactType.Gold] = (input.GoldResist != null) ? (int)input.GoldResist : 0;
  278. prop.ArtifactResist[(int)ArtifactType.Wood] = (input.WoodResist != null) ? (int)input.WoodResist : 0;
  279. prop.ArtifactResist[(int)ArtifactType.Water] = (input.WaterResist != null) ? (int)input.WaterResist : 0;
  280. prop.ArtifactResist[(int)ArtifactType.Fire] = (input.FireResist != null) ? (int)input.FireResist : 0;
  281. prop.ArtifactResist[(int)ArtifactType.Soil] = (input.SoilResist != null) ? (int)input.SoilResist : 0;
  282. //元素主属性加成
  283. prop.ArtifactMainPer = (input.ArtifactMainPer != null) ? input.ArtifactMainPer : 0;
  284. //boss伤害
  285. prop.ToBossCritRate = (input.ToBossCritRate != null) ? (int)input.ToBossCritRate : 0;
  286. prop.ToBossCritDamage = (input.ToBossCritDamage != null) ? (int)input.ToBossCritDamage : 0;
  287. prop.KillValuePer = (input.PvpKillValue != null) ? (int)input.PvpKillValue : 0;
  288. prop.YaoQiLevel = (input.YaoQiLevel != null) ? (int)input.YaoQiLevel : 0;
  289. //吸血
  290. prop.NormalAtkLeech = (input.NormalAtkLeech != null) ? (int)input.NormalAtkLeech : 0;
  291. prop.ActiveAtkLeech = (input.ActiveAtkLeech != null) ? (int)input.ActiveAtkLeech : 0;
  292. //怪物增伤
  293. prop.monsterDamageAdd = (input.FieldBossDamageAdd != null) ? (int)input.FieldBossDamageAdd : 0;
  294. prop.monsterDamageReduce = (input.DungeonMonsterDamageAdd != null) ? (int)input.DungeonMonsterDamageAdd : 0;
  295. //人物命格伤害加成
  296. prop.MonsterRestraint[0] = (input.MonsterRestraint1 != null) ? (int)input.MonsterRestraint1 : 0;
  297. prop.MonsterRestraint[1] = (input.MonsterRestraint2 != null) ? (int)input.MonsterRestraint2 : 0;
  298. prop.MonsterRestraint[2] = (input.MonsterRestraint3 != null) ? (int)input.MonsterRestraint3 : 0;
  299. prop.MonsterRestraint[3] = (input.MonsterRestraint4 != null) ? (int)input.MonsterRestraint4 : 0;
  300. prop.MonsterRestraint[4] = (input.MonsterRestraint5 != null) ? (int)input.MonsterRestraint5 : 0;
  301. //宠物天命属性
  302. prop.fateType = (input.fateType != null) ? (UnitFateType)input.fateType : UnitFateType.None;
  303. prop.fateValue = (input.fateValue != null) ? (int)input.fateValue : 0;
  304. //神器,背饰
  305. //神器属性
  306. prop.ArtifactIndex = (input.artifactIndex != null) ? input.artifactIndex : (int)ArtifactType.None;
  307. if (prop.ArtifactIndex < (int)ArtifactType.None || prop.ArtifactIndex > (int)ArtifactType.Fire)
  308. {
  309. prop.ArtifactIndex = (int)ArtifactType.None;
  310. }
  311. //神器背饰id
  312. prop.ArtifactDefenceIndex = (input.artifactDefenceIndex != null) ? input.artifactDefenceIndex : (int)ArtifactType.None;
  313. if (prop.ArtifactDefenceIndex < (int)ArtifactType.None || prop.ArtifactDefenceIndex > (int)ArtifactType.Fire)
  314. {
  315. prop.ArtifactDefenceIndex = (int)ArtifactType.None;
  316. }
  317. prop.BreakShieldValue = (input.breakShieldValue != null) ? input.breakShieldValue : 0;
  318. //猎妖属性
  319. prop.monsterAtk = (input.MonsterAtk != null) ? (int)input.MonsterAtk : 0;
  320. prop.monsterDef = (input.MonsterDef != null) ? (int)input.MonsterDef : 0;
  321. prop.monsterAtkPer = (input.MonsterAtkPer != null) ? (int)input.MonsterAtkPer : 0;
  322. prop.monsterDefPer = (input.MonsterDefPer != null) ? (int)input.MonsterDefPer : 0;
  323. //卡牌权重属性
  324. prop.cardWeight[(int)CardType.QingLong] = input.SHCQingLong != null ? (int)input.SHCQingLong : 0;
  325. prop.cardWeight[(int)CardType.ZhuQue] = input.SHCZhuQue != null ? (int)input.SHCZhuQue : 0;
  326. prop.cardWeight[(int)CardType.BaiHu] = input.SHCBaiHu != null ? (int)input.SHCBaiHu : 0;
  327. prop.cardWeight[(int)CardType.XuanWu] = input.SHCXuanWu != null ? (int)input.SHCXuanWu : 0;
  328. return prop;
  329. }
  330. catch (Exception err)
  331. {
  332. log.Error("createXmdsUnitProp error: " + err.Message, err);
  333. return new XmdsUnitProp();
  334. }
  335. }
  336. public UnitSkillData createXmdsUnitSkillInfo(dynamic input)
  337. {
  338. try
  339. {
  340. UnitSkillData unitSkillData = new UnitSkillData();
  341. unitSkillData.normalSkill.UnitSkills = new List<GameSkill>();
  342. unitSkillData.cardSkill.UnitSkills = new List<GameSkill>();
  343. foreach (dynamic obj in input)
  344. {
  345. GameSkill skill = new GameSkill();
  346. skill.SkillTimestampMS = (long)obj.skillTime;
  347. skill.SkillID = (int)obj.id;
  348. skill.SkillLevel = (int)obj.level;
  349. skill.SkillType = (XmdsSkillType)obj.type;
  350. if(obj.talentLevel != null)
  351. {
  352. skill.TalentSkillLevel1 = (int)obj.talentLevel[0];
  353. skill.TalentSkillLevel2 = (int)obj.talentLevel[1];
  354. skill.TalentSkillLevel3 = (int)obj.talentLevel[2];
  355. }
  356. if (obj.autoLaunch != null)
  357. {
  358. skill.AutoLaunch = (bool)obj.autoLaunch;
  359. }
  360. if (obj.cdTime != null)
  361. {
  362. skill.SkillCDDecreasePercent = (int)obj.cdTime;
  363. }
  364. if(skill.SkillType == XmdsSkillType.cardSkill)
  365. {
  366. unitSkillData.cardSkill.UnitSkills.Add(skill);
  367. }
  368. else
  369. {
  370. unitSkillData.normalSkill.UnitSkills.Add(skill);
  371. }
  372. }
  373. return unitSkillData;
  374. }
  375. catch (Exception err)
  376. {
  377. log.Error("createXmdsUnitSkillInfo error: " + err.Message, err);
  378. return null;
  379. }
  380. }
  381. }
  382. }