InstanceUnit.API.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. using CommonAI.Data;
  2. using CommonAI.Zone.Formula;
  3. using CommonAI.Zone.Helper;
  4. using CommonAI.ZoneClient;
  5. using CommonAI.ZoneServer.JSGModule;
  6. using CommonLang.Property;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Diagnostics;
  10. using System.Text;
  11. namespace CommonAI.Zone.Instance
  12. {
  13. partial class InstanceUnit
  14. {
  15. //-----------------------------------------------------------------------------------------------------------
  16. #region _sync_fields_
  17. protected readonly SyncUnitInfo mSyncInfo;
  18. private UnitFieldChangedEvent mSyncFields;
  19. private int m_dummy_0, m_dummy_1, m_dummy_2, m_dummy_3, m_dummy_4, m_dummy_5;
  20. //是否触发过破碎效果
  21. private bool isTriggerBroken = false;
  22. public void SetMaxHP(int value, bool auto_update_hp = false)
  23. {
  24. if (__mCurrentHP.SetMax(value, auto_update_hp))
  25. {
  26. syncFields(UnitFieldChangedEvent.MASK_HP | UnitFieldChangedEvent.MASK_MAX_HP);
  27. }
  28. }
  29. [DescAttribute("最大血量")]
  30. public int MaxHP
  31. {
  32. get { return __mCurrentHP.Max; }
  33. set
  34. {
  35. if (__mCurrentHP.SetMax(value, true))
  36. {
  37. syncFields(UnitFieldChangedEvent.MASK_HP | UnitFieldChangedEvent.MASK_MAX_HP);
  38. }
  39. }
  40. }
  41. [DescAttribute("最大能量")]
  42. public int MaxMP
  43. {
  44. get { return __mCurrentMP.Max; }
  45. set
  46. {
  47. if (__mCurrentMP.SetMax(value, true))
  48. {
  49. syncFields(UnitFieldChangedEvent.MASK_MP | UnitFieldChangedEvent.MASK_MAX_MP);
  50. }
  51. }
  52. }
  53. [DescAttribute("当前血量")]
  54. public int CurrentHP
  55. {
  56. get { return __mCurrentHP.Value; }
  57. set
  58. {
  59. if (!IsDead() && __mCurrentHP.SetValue(value))
  60. {
  61. syncFields(UnitFieldChangedEvent.MASK_HP);
  62. }
  63. }
  64. }
  65. [DescAttribute("当前能量")]
  66. public int CurrentMP
  67. {
  68. get { return __mCurrentMP.Value; }
  69. set
  70. {
  71. if (!IsDead() && __mCurrentMP.SetValue(value))
  72. {
  73. syncFields(UnitFieldChangedEvent.MASK_MP);
  74. }
  75. }
  76. }
  77. [DescAttribute("当前血量百分比")]
  78. public float CurrentHP_Pct { get { return __mCurrentHP.Value * 100f / __mCurrentHP.Max; } }
  79. [DescAttribute("当前能量百分比")]
  80. public float CurrentMP_Pct { get { return __mCurrentMP.Value * 100f / __mCurrentMP.Max; } }
  81. [DescAttribute("当前金币")]
  82. public int CurrentMoney
  83. {
  84. get { return mMoney; }
  85. set
  86. {
  87. if (mMoney != value)
  88. {
  89. int add = value - mMoney;
  90. mMoney = value;
  91. syncFields(UnitFieldChangedEvent.MASK_MONEY);
  92. Parent.cb_unitGotMoneyCallBack(this, add);
  93. }
  94. }
  95. }
  96. [DescAttribute("当前等级")]
  97. public int Level
  98. {
  99. get { return mLevel; }
  100. set
  101. {
  102. if (mLevel != value)
  103. {
  104. mLevel = value;
  105. syncFields(UnitFieldChangedEvent.MASK_LEVEL);
  106. }
  107. }
  108. }
  109. [DescAttribute("单位职业")]
  110. public int UnitPro()
  111. {
  112. return (int)this.Virtual.GetUnitPro();
  113. }
  114. [DescAttribute("性别0-男1-女")]
  115. public int UnitSex()
  116. {
  117. return (int)this.Virtual.GetUnitSex();
  118. }
  119. [DescAttribute("玩家职业")]
  120. public int PlayerPro()
  121. {
  122. if (this.IsPlayer)
  123. {
  124. return (int)this.Virtual.GetUnitPro();
  125. }
  126. return 0;
  127. }
  128. private void DoAddHP(int hp)
  129. {
  130. if (!IsDead())
  131. {
  132. if (__mCurrentHP.Add(hp))
  133. {
  134. syncFields(UnitFieldChangedEvent.MASK_HP);
  135. // 触发破碎效果
  136. if (this.Info.HitBreakPrecent > 0 && !this.isTriggerBroken)
  137. {
  138. int precent = (int)((double)this.CurrentHP / this.MaxHP * 100);
  139. if (precent <= this.Info.HitBreakPrecent)
  140. {
  141. //Console.WriteLine("触发破碎");
  142. this.isTriggerBroken = true;
  143. UnitHitBreak hitBreak = new UnitHitBreak(this.ID);
  144. this.Parent.queueObjectEvent(this, hitBreak);
  145. }
  146. }
  147. }
  148. }
  149. }
  150. private void DoAddMP(int mp, bool force = false)
  151. {
  152. if (IsDead() || (mp < 0 && !this.Virtual.IsCanReduceMP(force)))
  153. {
  154. return;
  155. }
  156. if (__mCurrentMP.Add(mp))
  157. {
  158. syncFields(UnitFieldChangedEvent.MASK_MP);
  159. //进入破定状态
  160. if (__mCurrentMP.Value == 0 && this.CurrentActionStatus != UnitActionStatus.BreakShield)
  161. {
  162. this.changeState(new StateBreakShield(this), true);
  163. }
  164. //System.Console.WriteLine("更新定力值:" + this.Info.Name + ", " + __mCurrentMP.Value);
  165. }
  166. }
  167. public void AddSP(int st)
  168. {
  169. // if (!IsDead)
  170. // {
  171. // if (__mCurrentSP.Add(st))
  172. // {
  173. // syncFields(UnitFieldChangedEvent.MASK_SP);
  174. // }
  175. // }
  176. }
  177. public int AddHP(int hp, InstanceUnit sender, bool sendHit = true, AttackSource source = null)
  178. {
  179. int finalHP = ReduceHP(-hp, sender, source, sendHit);
  180. //排除怪物回血
  181. JSGHackerModule.PrintDmgInfo(this, sender, source, hp, finalHP);
  182. return finalHP;
  183. }
  184. public void AddHP_Pct(float percent, InstanceUnit sender)
  185. {
  186. AddHP((int)(percent / 100f * MaxHP), sender);
  187. }
  188. /// <summary>
  189. /// 直接设置移动速度
  190. /// </summary>
  191. /// <param name="speed"></param>
  192. public void SetMoveSpeed(float speed)
  193. {
  194. if (speed < 0)
  195. {
  196. speed = 0;
  197. }
  198. if (speed != __mCurrentMoveSpeedSEC)
  199. {
  200. __mCurrentMoveSpeedSEC = speed;
  201. syncFields(UnitFieldChangedEvent.MASK_SPEED);
  202. }
  203. }
  204. /// <summary>
  205. /// 直接设置攻速
  206. /// </summary>
  207. /// <param name="speed"></param>
  208. public void SetAttackSpeed(int speed)
  209. {
  210. if (speed <= 0)
  211. {
  212. speed = GlobalData.DEFAULT_ATTACK_SPEED;
  213. }
  214. if (speed != __mCurrentAttackSpeed)
  215. {
  216. __mCurrentAttackSpeed = speed;
  217. }
  218. }
  219. public int GetAttackSpeed()
  220. {
  221. return this.__mCurrentAttackSpeed;
  222. }
  223. /// <summary>
  224. /// 直接设置当前技能cd减少
  225. /// </summary>
  226. /// <param name="value"></param>
  227. public void SetSkillCdReduce(float value)
  228. {
  229. if (value < 0)
  230. {
  231. value = 0;
  232. }
  233. if (value != __mCurrentSkillCdReduce)
  234. {
  235. __mCurrentSkillCdReduce = value;
  236. syncFields(UnitFieldChangedEvent.MASK_SKILL_CD_ACC);
  237. }
  238. }
  239. /// <summary>
  240. /// 直接设置受到控制效果的持续时间减少
  241. /// </summary>
  242. /// <param name="value"></param>
  243. public void SetControledTimeReduce(float value)
  244. {
  245. if (value < 0)
  246. {
  247. value = 0;
  248. }
  249. if (value != __mCurrentControledTimeReduce)
  250. {
  251. __mCurrentControledTimeReduce = value;
  252. syncFields(UnitFieldChangedEvent.MASK_CONTROLED_ACC);
  253. }
  254. }
  255. public void SetControledTimeAdd(float value)
  256. {
  257. if (value < 0)
  258. {
  259. value = 0;
  260. }
  261. if (value != __mControledTimeAdd)
  262. {
  263. __mControledTimeAdd = value;
  264. syncFields(UnitFieldChangedEvent.MASK_CONTROLED_ACC);
  265. }
  266. }
  267. /// <summary>
  268. /// 设置所有技能动作速度加成
  269. /// </summary>
  270. /// <param name="rate"></param>
  271. public void SetSkillActionSpeedRate(float rate)
  272. {
  273. if (rate < 0)
  274. {
  275. rate = 0;
  276. }
  277. if (rate != __mSkillActionSpeedRate)
  278. {
  279. __mSkillActionSpeedRate = rate;
  280. }
  281. }
  282. /** 是否满血 */
  283. public bool IsFullHP()
  284. {
  285. return this.CurrentHP == this.MaxHP;
  286. }
  287. /// <summary>
  288. /// 设置当前快速施法速度(基准0)(1是1倍速)
  289. /// </summary>
  290. /// <param name="fcr"></param>
  291. public void SetFastCastRate(float fcr)
  292. {
  293. if (mFastCastRate != fcr)
  294. {
  295. mFastCastRate = fcr;
  296. syncFields(UnitFieldChangedEvent.MASK_FCR);
  297. }
  298. }
  299. public int Dummy_0
  300. {
  301. get { return m_dummy_0; }
  302. set
  303. {
  304. if (m_dummy_0 != value)
  305. {
  306. m_dummy_0 = value;
  307. syncFields(UnitFieldChangedEvent.MASK_DUMMY_0);
  308. }
  309. }
  310. }
  311. public int Dummy_1
  312. {
  313. get { return m_dummy_1; }
  314. set
  315. {
  316. if (m_dummy_1 != value)
  317. {
  318. m_dummy_1 = value;
  319. syncFields(UnitFieldChangedEvent.MASK_DUMMY_1);
  320. }
  321. }
  322. }
  323. public int Dummy_2
  324. {
  325. get { return m_dummy_2; }
  326. set
  327. {
  328. if (m_dummy_2 != value)
  329. {
  330. m_dummy_2 = value;
  331. syncFields(UnitFieldChangedEvent.MASK_DUMMY_2);
  332. }
  333. }
  334. }
  335. public int Dummy_3
  336. {
  337. get { return m_dummy_3; }
  338. set
  339. {
  340. if (m_dummy_3 != value)
  341. {
  342. m_dummy_3 = value;
  343. syncFields(UnitFieldChangedEvent.MASK_DUMMY_3);
  344. }
  345. }
  346. }
  347. public int Dummy_4
  348. {
  349. get { return m_dummy_4; }
  350. set
  351. {
  352. if (m_dummy_4 != value)
  353. {
  354. m_dummy_4 = value;
  355. syncFields(UnitFieldChangedEvent.MASK_DUMMY_4);
  356. }
  357. }
  358. }
  359. public int Dummy_5
  360. {
  361. get { return m_dummy_5; }
  362. set
  363. {
  364. if (m_dummy_5 != value)
  365. {
  366. m_dummy_5 = value;
  367. syncFields(UnitFieldChangedEvent.MASK_DUMMY_5);
  368. }
  369. }
  370. }
  371. public void syncFields(uint mask)
  372. {
  373. if (mSyncFields == null)
  374. {
  375. mSyncFields = new UnitFieldChangedEvent();
  376. }
  377. mSyncFields.mask |= mask;
  378. }
  379. private void updateSyncFields()
  380. {
  381. if (mSyncFields != null)
  382. {
  383. GenSyncFields(mSyncFields);
  384. queueEvent(mSyncFields);
  385. mSyncFields = null;
  386. }
  387. }
  388. public void GenSyncFields(UnitFieldChangedEvent sync)
  389. {
  390. sync.currentHP = __mCurrentHP.Value;
  391. sync.currentMP = __mCurrentMP.Value;
  392. sync.maxHP = __mCurrentHP.Max;
  393. sync.maxMP = __mCurrentMP.Max;
  394. sync.maxSP = 0;
  395. sync.currentSP = 0;
  396. sync.currentSpeed = __mCurrentMoveSpeedSEC;
  397. sync.currentFCR = mFastCastRate;
  398. sync.currentMoney = mMoney;
  399. sync.level = mLevel;
  400. sync.dummy_0 = m_dummy_0;
  401. sync.dummy_1 = m_dummy_1;
  402. sync.dummy_2 = m_dummy_2;
  403. sync.dummy_3 = m_dummy_3;
  404. sync.dummy_4 = m_dummy_4;
  405. sync.dummy_5 = m_dummy_5;
  406. }
  407. public override SyncObjectInfo GenSyncInfo(bool net)
  408. {
  409. return GenSyncUnitInfo(net);
  410. }
  411. public SyncUnitInfo GenSyncUnitInfo(bool net = false)
  412. {
  413. mSyncInfo.status = (byte)CurrentActionStatus;
  414. mSyncInfo.sub_status = (byte)CurrentActionSubstate;
  415. mSyncInfo.sub_flag = mSubStateExt;
  416. mSyncInfo.Force = mForce;
  417. mSyncInfo.Level = mLevel;
  418. mSyncInfo.x = X;
  419. mSyncInfo.y = Y;
  420. mSyncInfo.direction = this.Direction;
  421. if (net)
  422. {
  423. mSyncInfo.CurrentBuffStatus = this.GetCurrentBuffStatus();
  424. mSyncInfo.fields.mask = UnitFieldChangedEvent.MASK_ALL;
  425. GenSyncFields(mSyncInfo.fields);
  426. }
  427. return mSyncInfo;
  428. }
  429. /// <summary>
  430. /// 设置单位显示信息
  431. /// </summary>
  432. /// <param name="visible_data"></param>
  433. public void SetVisibleInfo(IUnitVisibleData visible_data)
  434. {
  435. mSyncInfo.VisibleInfo = visible_data;
  436. }
  437. public void SetDiaplayerName(String name)
  438. {
  439. if (mSyncInfo.VisibleInfo != null)
  440. {
  441. mSyncInfo.VisibleInfo.setVisibleName(name);
  442. }
  443. this.mSyncInfo.Name = name;
  444. }
  445. public override String GetTemplateData()
  446. {
  447. return "Unit:" + this.mInfo.ID;
  448. }
  449. //设置自动拾取范围
  450. public virtual void SetAutoPickRange(int value) { }
  451. #endregion
  452. //-----------------------------------------------------------------------------------------------------------
  453. #region script_support
  454. public string get_name()
  455. {
  456. return mName;
  457. }
  458. public int get_force()
  459. {
  460. return mForce;
  461. }
  462. public int get_level()
  463. {
  464. return mLevel;
  465. }
  466. public bool is_dead()
  467. {
  468. return IsDead();
  469. }
  470. public bool is_enable()
  471. {
  472. return Enable;
  473. }
  474. public bool is_paused()
  475. {
  476. return IsPaused;
  477. }
  478. public bool is_none_block()
  479. {
  480. return IsNoneBlock;
  481. }
  482. public bool is_none_skill()
  483. {
  484. return IsNoneSkill;
  485. }
  486. public uint get_id()
  487. {
  488. return ID;
  489. }
  490. public UnitInfo get_info()
  491. {
  492. return mInfo;
  493. }
  494. public Random get_random()
  495. {
  496. return RandomN;
  497. }
  498. public float get_x()
  499. {
  500. return X;
  501. }
  502. public float get_y()
  503. {
  504. return Y;
  505. }
  506. public float get_direction()
  507. {
  508. return Direction;
  509. }
  510. public float set_direction(float d)
  511. {
  512. this.faceTo(d);
  513. return d;
  514. }
  515. public string get_unit_tag()
  516. {
  517. return UnitTag;
  518. }
  519. public string set_unit_tag(string str)
  520. {
  521. UnitTag = str;
  522. return str;
  523. }
  524. public int get_max_hp()
  525. {
  526. return MaxHP;
  527. }
  528. public int set_max_hp(int max)
  529. {
  530. MaxHP = max;
  531. return max;
  532. }
  533. public int get_max_mp()
  534. {
  535. return MaxMP;
  536. }
  537. //public int set_max_mp(int mp)
  538. //{
  539. // MaxMP = mp;
  540. // return mp;
  541. //}
  542. public int get_current_hp()
  543. {
  544. return __mCurrentHP.Value;
  545. }
  546. public int set_current_hp(int hp)
  547. {
  548. CurrentHP = hp;
  549. return hp;
  550. }
  551. public int get_current_mp()
  552. {
  553. return __mCurrentMP.Value;
  554. }
  555. //public int set_current_mp(int mp)
  556. //{
  557. // CurrentMP = mp;
  558. // return mp;
  559. //}
  560. public int set_level(int lv)
  561. {
  562. Level = lv;
  563. return lv;
  564. }
  565. //public void add_mp(int mp)
  566. //{
  567. // AddMP(mp);
  568. //}
  569. public void add_hp(int hp)
  570. {
  571. AddHP(hp, this);
  572. }
  573. public void add_sp(int sp)
  574. {
  575. AddSP(sp);
  576. }
  577. public void add_buff(int buffID)
  578. {
  579. AddBuff(buffID);
  580. }
  581. public void clear_buff()
  582. {
  583. clearBuffs();
  584. }
  585. public void use_item(int itemTemplateID)
  586. {
  587. ItemTemplate item = Templates.getItem(itemTemplateID);
  588. if (item != null)
  589. {
  590. UseItem(item);
  591. }
  592. }
  593. #endregion
  594. }
  595. }