HeroActorData.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. public class HeroActorData : ActorData
  6. {
  7. private string mHeadIcon;
  8. protected RoleBaseData mBaseData;
  9. protected RoleAttributeData mAttrData;
  10. protected ProfessionData mProfessionData;
  11. public RoleBaseData BaseData { get { return mBaseData; } }
  12. public RoleAttributeData AttrData { get { return mAttrData; } }
  13. public ProfessionData ProfessionData { get { return mProfessionData; } }
  14. private int mProfessionId = 0;
  15. public int ProfessionId
  16. {
  17. get { return mProfessionId; }
  18. }
  19. private SkillParam[] mUsedSkills = null;
  20. private Dictionary<BodyPart, string> mPartResList = null;
  21. private FashionParam mFashionData;
  22. public Dictionary<BodyPart, string> PartResList
  23. {
  24. get { return mPartResList; }
  25. }
  26. public FashionParam FashionData
  27. {
  28. get { return mFashionData; }
  29. }
  30. public override string AnimCtrlName
  31. {
  32. get { return mBaseData != null ? mBaseData.BattleCtrlPath : ""; }
  33. }
  34. public override string ShowAnimCtrlName
  35. {
  36. get { return mBaseData != null ? mBaseData.ShowCtrlPath : ""; }
  37. }
  38. public override string ProfessionIcon
  39. {
  40. get
  41. {
  42. return mProfessionData != null ? mProfessionData.Icon : "";
  43. }
  44. }
  45. public override string HeadIcon
  46. {
  47. get { return mBaseData.headId; }
  48. set { }
  49. }
  50. public override string BattleBigIcon
  51. {
  52. get { return mBaseData.battleBigIcon; }
  53. }
  54. #region OVERRIDE_PROPERTIES
  55. public override string SkillFrameEventName
  56. {
  57. get { return mBaseData.frameEventName; }
  58. }
  59. public override int NatureId
  60. {
  61. get { return mProfessionData.NatureId; }
  62. }
  63. public override SFloat BaseLife
  64. {
  65. get
  66. {
  67. if (mAttrData == null) return 0;
  68. SFloat a = BattleFormulaParamMgr.Instance.GetParam(1);
  69. return mAttrData.GetAttr(Attr_Life) * mProfessionData.HpRate * (1 + VIT * a);
  70. }
  71. }
  72. public override SFloat BaseSp
  73. {
  74. get
  75. {
  76. if (mAttrData == null) return 0;
  77. SFloat a = BattleFormulaParamMgr.Instance.GetParam(2);
  78. return mAttrData.GetAttr(Attr_Sp) * mProfessionData.SpRate * (1 + INT * a);
  79. }
  80. }
  81. public override SFloat BaseAttack
  82. {
  83. get
  84. {
  85. SFloat attack = mAttrData.GetAttr(Attr_Attack) * mProfessionData.AtkRate;
  86. if (IsFront)
  87. {
  88. SFloat a = BattleFormulaParamMgr.Instance.GetParam(3);
  89. SFloat b = BattleFormulaParamMgr.Instance.GetParam(4);
  90. SFloat c = BattleFormulaParamMgr.Instance.GetParam(35);
  91. attack += a * (STR + c * DEX + c * LUK) + b * Mathf.Pow(Mathf.FloorToInt(STR * 0.1f), 2);
  92. }
  93. else
  94. {
  95. SFloat a = BattleFormulaParamMgr.Instance.GetParam(5);
  96. SFloat b = BattleFormulaParamMgr.Instance.GetParam(6);
  97. SFloat c = BattleFormulaParamMgr.Instance.GetParam(36);
  98. attack += a * (DEX + c * STR + c * LUK) + b * Mathf.Pow(Mathf.FloorToInt(DEX * 0.1f), 2);
  99. }
  100. return attack;
  101. }
  102. }
  103. public override SFloat BaseMagicAttack
  104. {
  105. get
  106. {
  107. SFloat a = BattleFormulaParamMgr.Instance.GetParam(7), b = BattleFormulaParamMgr.Instance.GetParam(8);
  108. SFloat magicAttack = mAttrData.GetAttr(Attr_MagicAttack) * mProfessionData.MagicAtkRate;
  109. magicAttack += INT * a + b * Mathf.Pow(Mathf.FloorToInt(INT * 0.1f), 2);
  110. return magicAttack;
  111. }
  112. }
  113. public override SFloat BaseDefense
  114. {
  115. get
  116. {
  117. SFloat a = BattleFormulaParamMgr.Instance.GetParam(9);
  118. SFloat defense = mAttrData.GetAttr(Attr_Defense) * mProfessionData.DefRate;
  119. defense = defense + a * VIT;
  120. return defense;
  121. }
  122. }
  123. public override SFloat BaseMagicDefense
  124. {
  125. get
  126. {
  127. SFloat a = BattleFormulaParamMgr.Instance.GetParam(10);
  128. SFloat magicDef = mAttrData.GetAttr(Attr_MagicDefense) * mProfessionData.MagicDefRate;
  129. magicDef = magicDef + a * INT;
  130. return magicDef;
  131. }
  132. }
  133. public override SFloat BaseDodge
  134. {
  135. get
  136. {
  137. SFloat a = BattleFormulaParamMgr.Instance.GetParam(11);
  138. SFloat dodge = mAttrData.GetAttr(Attr_Dodge) * mProfessionData.DodgeRate + a * AGI;
  139. return dodge;
  140. }
  141. }
  142. public override SFloat BaseHit
  143. {
  144. get
  145. {
  146. SFloat a = BattleFormulaParamMgr.Instance.GetParam(12);
  147. SFloat hit = mAttrData.GetAttr(Attr_Hit) * mProfessionData.HitRate + a * DEX;
  148. return hit;
  149. }
  150. }
  151. public override SFloat BaseCrit
  152. {
  153. get
  154. {
  155. SFloat a = BattleFormulaParamMgr.Instance.GetParam(13);
  156. SFloat crit = mAttrData.GetAttr(Attr_Crit) * mProfessionData.CritRate + a * LUK;
  157. return crit;
  158. }
  159. }
  160. public override SFloat BaseTen
  161. {
  162. get
  163. {
  164. SFloat a = BattleFormulaParamMgr.Instance.GetParam(14);
  165. SFloat ten = mAttrData.GetAttr(Attr_Ten) * mProfessionData.TenacityRate + a * LUK;
  166. return ten;
  167. }
  168. }
  169. public override SFloat BaseAttackSpeed
  170. {
  171. get
  172. {
  173. return mProfessionData.AttackSpeed;
  174. }
  175. }
  176. public override SFloat Life
  177. {
  178. get
  179. {
  180. SFloat ServerData = GetSeverSecondAttr(Attr_Life);
  181. if (0 <= ServerData)
  182. return ServerData;
  183. return LocalLife;
  184. }
  185. }
  186. public override SFloat Sp
  187. {
  188. get
  189. {
  190. SFloat ServerData = GetSeverSecondAttr(Attr_Sp);
  191. if (0 <= ServerData)
  192. return ServerData;
  193. return LocalSp;
  194. }
  195. }
  196. /// <summary>
  197. /// 物攻
  198. /// </summary>
  199. public override SFloat Attack
  200. {
  201. get
  202. {
  203. SFloat ServerData = GetSeverSecondAttr(Attr_Attack);
  204. if (0 <= ServerData)
  205. return ServerData;
  206. return LocalAttack;
  207. }
  208. }
  209. public override SFloat MagicAttack
  210. {
  211. get
  212. {
  213. SFloat ServerData = GetSeverSecondAttr(Attr_MagicAttack);
  214. if (0 <= ServerData)
  215. return ServerData;
  216. return LocalMagicAttack;
  217. }
  218. }
  219. /// <summary>
  220. /// 物防
  221. /// </summary>
  222. public override SFloat Defense
  223. {
  224. get
  225. {
  226. SFloat ServerData = GetSeverSecondAttr(Attr_Defense);
  227. if (0 <= ServerData)
  228. return ServerData;
  229. return LocalDefense;
  230. }
  231. }
  232. //魔防
  233. public override SFloat MagicDefense
  234. {
  235. get
  236. {
  237. SFloat ServerData = GetSeverSecondAttr(Attr_MagicDefense);
  238. if (0 <= ServerData)
  239. return ServerData;
  240. return LocalMagicDefense;
  241. }
  242. }
  243. public override SFloat Hit
  244. {
  245. get
  246. {
  247. SFloat ServerData = GetSeverSecondAttr(Attr_Hit);
  248. if (0 <= ServerData)
  249. return ServerData;
  250. return LocalHit;
  251. }
  252. }
  253. public override SFloat Crit
  254. {
  255. get
  256. {
  257. SFloat ServerData = GetSeverSecondAttr(Attr_Crit);
  258. if (0 <= ServerData)
  259. return ServerData;
  260. return LocalCrit;
  261. }
  262. }
  263. public override SFloat Dodge
  264. {
  265. get
  266. {
  267. SFloat ServerData = GetSeverSecondAttr(Attr_Dodge);
  268. if (0 <= ServerData)
  269. return ServerData;
  270. return LocalDodge;
  271. }
  272. }
  273. public override SFloat Ten
  274. {
  275. get
  276. {
  277. SFloat ServerData = GetSeverSecondAttr(Attr_Ten);
  278. if (0 <= ServerData)
  279. return ServerData;
  280. return LocalTen;
  281. }
  282. }
  283. public override SFloat LocalAttackSpeed
  284. {
  285. get
  286. {
  287. SFloat a = BattleFormulaParamMgr.Instance.GetParam(24);
  288. SFloat b = BattleFormulaParamMgr.Instance.GetParam(25);
  289. SFloat attackSpeed = (BaseAttackSpeed + GetAdditionalAttr(Attr_AttackSpeed)) * (1 + GetAdditionalAttrPercent(Attr_AttackSpeed_Percent)) + AGI * a + DEX * b;
  290. return attackSpeed;
  291. }
  292. }
  293. //攻击速度
  294. public override SFloat AttackSpeed
  295. {
  296. get
  297. {
  298. SFloat ServerData = GetSeverSecondAttr(Attr_AttackSpeed);
  299. if (0 <= ServerData)
  300. return ServerData;
  301. return LocalAttackSpeed;
  302. }
  303. }
  304. public override SFloat LocalCastAcceleration
  305. {
  306. get
  307. {
  308. SFloat a = BattleFormulaParamMgr.Instance.GetParam(28);
  309. SFloat CastAccelerationSpeed = DEX * a * 1000;//毫秒
  310. return CastAccelerationSpeed;
  311. }
  312. }
  313. //施法速度
  314. public override SFloat CastAcceleration
  315. {
  316. get
  317. {
  318. SFloat ServerData = GetSeverSecondAttr(Attr_CastAcceleration);
  319. if (0 <= ServerData)
  320. return ServerData;
  321. return LocalCastAcceleration;
  322. }
  323. }
  324. //神威值
  325. public override SFloat GodPower
  326. {
  327. get
  328. {
  329. SFloat ServerData = GetSeverSecondAttr(Attr_GodPow);
  330. if (0 <= ServerData)
  331. return ServerData;
  332. return LocalGodPower;
  333. }
  334. }
  335. public override bool IsHero
  336. {
  337. get { return true; }
  338. }
  339. public override int AvatarID
  340. {
  341. get
  342. {
  343. return mBaseData.avatarId;
  344. }
  345. }
  346. private string mName;
  347. public override string Name
  348. {
  349. get { return mName; }
  350. set
  351. {
  352. mName = value;
  353. }
  354. }
  355. public override string Description
  356. {
  357. get { return mBaseData.Desc; }
  358. }
  359. public override ProfessionType Profession
  360. {
  361. get { return (ProfessionType)mProfessionData.ProfessionType; }
  362. }
  363. public override int JobStage
  364. {
  365. get { return mProfessionData.Step; }
  366. }
  367. public override int JobBranch
  368. {
  369. get { return mProfessionData.ProfessionBranch; }
  370. }
  371. public override int PositionValue
  372. {
  373. get { return mProfessionData.Position; }
  374. }
  375. private SInt mBaseSTR = 1;
  376. public override SInt BaseSTR
  377. {
  378. get { return mBaseSTR; }
  379. set { mBaseSTR = value; }
  380. }
  381. private SInt mBaseAGI = 1;
  382. public override SInt BaseAGI
  383. {
  384. get { return mBaseAGI; }
  385. set { mBaseAGI = value; }
  386. }
  387. private SInt mBaseINT = 1;
  388. public override SInt BaseINT
  389. {
  390. get { return mBaseINT; }
  391. set { mBaseINT = value; }
  392. }
  393. private SInt mBaseVIT = 1;
  394. public override SInt BaseVIT
  395. {
  396. get { return mBaseVIT; }
  397. set { mBaseVIT = value; }
  398. }
  399. private SInt mBaseDEX = 1;
  400. public override SInt BaseDEX
  401. {
  402. get { return mBaseDEX; }
  403. set { mBaseDEX = value; }
  404. }
  405. private SInt mBaseLUK = 1;
  406. public override SInt BaseLUK
  407. {
  408. get { return mBaseLUK; }
  409. set { mBaseLUK = value; }
  410. }
  411. public override SInt STR
  412. {
  413. get { return mBaseSTR + (int)GetAdditionalAttr(Attr_STR); }
  414. }
  415. public override SInt AGI
  416. {
  417. get { return mBaseAGI + (int)GetAdditionalAttr(Attr_AGI); }
  418. }
  419. public override SInt INT
  420. {
  421. get { return mBaseINT + (int)GetAdditionalAttr(Attr_INT); }
  422. }
  423. public override SInt VIT
  424. {
  425. get { return mBaseVIT + (int)GetAdditionalAttr(Attr_VIT); }
  426. }
  427. public override SInt DEX
  428. {
  429. get { return mBaseDEX + (int)GetAdditionalAttr(Attr_DEX); }
  430. }
  431. public override SInt LUK
  432. {
  433. get { return mBaseLUK + (int)GetAdditionalAttr(Attr_LUK); }
  434. }
  435. #endregion
  436. public HeroActorData(int id) : base(id)
  437. {
  438. mActorType = ActorType.Hero;
  439. }
  440. public override void Dispose()
  441. {
  442. if (mAttrData != null)
  443. {
  444. mAttrData.Dispose();
  445. mAttrData = null;
  446. }
  447. if (mProfessionData != null)
  448. {
  449. mProfessionData.Dispose();
  450. mProfessionData = null;
  451. }
  452. base.Dispose();
  453. }
  454. public override void Initialize(int id, int level, SkillParam[] usedSkills)
  455. {
  456. base.Initialize(id, level, usedSkills);
  457. mBaseData = new RoleBaseData(id);
  458. mAttrData = new RoleAttributeData(mLevel);
  459. mAvatarData = new AvatarData(AvatarID);
  460. mUsedSkills = usedSkills;
  461. Gender = mBaseData.sex;
  462. }
  463. public override void SetLevel(int lv)
  464. {
  465. if(mLevel != lv)
  466. {
  467. mLevel = lv;
  468. mAttrData = new RoleAttributeData(mLevel);
  469. }
  470. }
  471. public void SetProfessionId(int id,bool needLoadSkill = false)
  472. {
  473. if (mProfessionId == id) return;
  474. mProfessionId = id;
  475. mProfessionData = new ProfessionData(id);
  476. if (mSkillMgr == null)
  477. mSkillMgr = new SkillManager(this);
  478. if (mUsedSkills != null)
  479. {
  480. mSkillMgr.InitializeSkill(mProfessionData.NormalSkillIds, mUsedSkills);
  481. }
  482. else
  483. {
  484. mSkillMgr.InitializeSkill(mProfessionData.NormalSkillIds, mProfessionData.SkillIds);
  485. }
  486. if(mProfessionData.AlternativeSkills != null && mProfessionData.AlternativeSkills.Length > 0)
  487. {
  488. mSkillMgr.InitAlternativeSkills(mProfessionData.AlternativeSkills);
  489. }
  490. ResetFirstSkill();
  491. valid = mBaseData.valid && mProfessionData.valid && mAttrData.valid && mAvatarData.valid;
  492. if(needLoadSkill)
  493. {
  494. mSkillMgr.LoadSkills();
  495. mSkillMgr.LoadNorlSkills();
  496. }
  497. }
  498. public override void RefreshSkills(SkillParam[] usedSkills)
  499. {
  500. if (usedSkills != null)
  501. {
  502. mUsedSkills = usedSkills;
  503. mSkillMgr.InitializeSkill(mProfessionData.NormalSkillIds, mUsedSkills);
  504. }
  505. }
  506. public void SetFashionData(FashionParam fashionData)
  507. {
  508. mFashionData = fashionData;
  509. ParseFashionPartRes();
  510. }
  511. public BodyPartParam GetBodyPartParam(BodyPart part)
  512. {
  513. if (mFashionData.parts == null) return default(BodyPartParam);
  514. for(int idx = 0; idx < mFashionData.parts.Length;idx++)
  515. {
  516. if (mFashionData.parts[idx].part == (int)part) return mFashionData.parts[idx];
  517. }
  518. return default(BodyPartParam);
  519. }
  520. private void ParseFashionPartRes()
  521. {
  522. if (mPartResList == null)
  523. mPartResList = new Dictionary<BodyPart, string>();
  524. else
  525. mPartResList.Clear();
  526. if (mBaseData == null) return;
  527. int cfgId = 0;
  528. if (Gender == (int)Role_Gender.Male)
  529. {
  530. cfgId = GlobalConfig.c_man_base_model_path;
  531. }
  532. else if (Gender == (int)Role_Gender.Female)
  533. {
  534. cfgId = GlobalConfig.c_woman_base_model_path;
  535. }
  536. //基础骨骼
  537. string baseBonePrefab = GlobalConfig.Instance.GetConfigStrValue(cfgId);
  538. if (!string.IsNullOrEmpty(baseBonePrefab))
  539. mPartResList.Add(BodyPart.Skeleton, baseBonePrefab);
  540. //脸部
  541. string facePrefab = null;
  542. if (Gender == (int)Role_Gender.Male)
  543. {
  544. facePrefab = GlobalConfig.Instance.GetConfigStrValue(GlobalConfig.c_man_face_model_path);
  545. }
  546. else
  547. {
  548. facePrefab = GlobalConfig.Instance.GetConfigStrValue(GlobalConfig.c_woman_face_model_path);
  549. }
  550. if (!string.IsNullOrEmpty(facePrefab))
  551. {
  552. mPartResList.Add(BodyPart.Face, facePrefab);
  553. }
  554. if (mFashionData.parts != null)
  555. {
  556. for(int idx =0; idx < mFashionData.parts.Length;idx++)
  557. {
  558. BodyPartParam part = mFashionData.parts[idx];
  559. //DebugHelper.LogError("part :" + part.part + " prefab:" + part.modelPrefab);
  560. if (string.IsNullOrEmpty(part.modelPrefab)) continue;
  561. mPartResList.Add((BodyPart)part.part, part.modelPrefab);
  562. }
  563. }
  564. }
  565. protected override JSONObject FashionToJson()
  566. {
  567. JSONObject json = mFashionData.ToJson();
  568. return json;
  569. }
  570. protected override JSONObject BaseToJson()
  571. {
  572. JSONObject json = base.BaseToJson();
  573. json.AddField("jobId", mProfessionId);
  574. return json;
  575. }
  576. }