Statistic.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using CommonLang;
  5. using CommonAI.ZoneServer;
  6. using CommonLang.IO;
  7. namespace CommonAI.Zone.Instance.Helper
  8. {
  9. public abstract class IUnitStatistic
  10. {
  11. public InstanceUnit Owner { get; private set; }
  12. public IUnitStatistic(InstanceUnit owner)
  13. {
  14. this.Owner = owner;
  15. }
  16. /// <summary>
  17. /// 转存可序列化协议对象
  18. /// </summary>
  19. /// <returns></returns>
  20. public virtual UnitStatisticData ToUnitStatisticData()
  21. {
  22. var ret = new UnitStatisticData();
  23. ret.ObjectID = Owner.ID;
  24. ret.DeadCount = this.DeadCount;
  25. ret.KillUnitCount = this.KillUnitCount;
  26. ret.KillPlayerCount = this.KillPlayerCount;
  27. ret.SelfDamage = this.SelfDamage;
  28. ret.TotalDamage = this.TotalDamage;
  29. ret.PlayerDamage = this.PlayerDamage;
  30. ret.TotalHealing = this.TotalHealing;
  31. ret.PlayerHealing = this.PlayerHealing;
  32. return ret;
  33. }
  34. //------------------------------------------------------------------------------------
  35. /// <summary>
  36. /// 死亡次数
  37. /// </summary>
  38. public abstract int DeadCount { get; }
  39. /// <summary>
  40. /// 总共杀死玩家数量
  41. /// </summary>
  42. public abstract int KillPlayerCount { get; }
  43. /// <summary>
  44. /// 总共杀死单位数量
  45. /// </summary>
  46. public abstract int KillUnitCount { get; }
  47. /// <summary>
  48. /// 承受伤害
  49. /// </summary>
  50. public abstract long SelfDamage { get; }
  51. /// <summary>
  52. /// 对所有单位输出的总伤害
  53. /// </summary>
  54. public abstract long TotalDamage { get; }
  55. /// <summary>
  56. /// 对玩家输出的总伤害
  57. /// </summary>
  58. public abstract long PlayerDamage { get; }
  59. /// <summary>
  60. /// 对所有单位输出的总治疗量
  61. /// </summary>
  62. public abstract long TotalHealing { get; }
  63. /// <summary>
  64. /// 对玩家输出的总治疗量
  65. /// </summary>
  66. public abstract long PlayerHealing { get; }
  67. /// <summary>
  68. /// 连斩信息
  69. /// </summary>
  70. public abstract long preKillTime { get; set; }
  71. public abstract short continueKills { get; set; }
  72. /// <summary>
  73. /// 总共杀死特定类型单位数量
  74. /// </summary>
  75. /// <param name="type"></param>
  76. public abstract int GetKillUnitCount(UnitInfo.UnitType type);
  77. //------------------------------------------------------------------------------------
  78. /// <summary>
  79. /// 当自己死亡
  80. /// </summary>
  81. /// <param name="killer"></param>
  82. public abstract void onDead(InstanceUnit killer);
  83. /// <summary>
  84. /// 干掉别人
  85. /// </summary>
  86. /// <param name="target"></param>
  87. public abstract void onKill(InstanceUnit target);
  88. /// <summary>
  89. /// 当受到伤害
  90. /// </summary>
  91. /// <param name="attacker"></param>
  92. /// <param name="reduceHP"></param>
  93. public abstract void onDamage(InstanceUnit attacker, int reduceHP);
  94. /// <summary>
  95. /// 当造成伤害
  96. /// </summary>
  97. /// <param name="target"></param>
  98. /// <param name="reduceHP"></param>
  99. public abstract void onAttack(InstanceUnit target, int reduceHP);
  100. /// <summary>
  101. /// 当使用道具
  102. /// </summary>
  103. /// <param name="item"></param>
  104. public abstract void onUseItem(ItemTemplate item);
  105. //------------------------------------------------------------------------------------
  106. internal void LogDamage(IUnitStatistic attacker, int reduceHP)
  107. {
  108. if (reduceHP >0 && this.Owner.CurrentHP < reduceHP)
  109. {
  110. reduceHP = this.Owner.CurrentHP;
  111. }
  112. if(reduceHP <0 && this.Owner.MaxHP - this.Owner.CurrentHP < -reduceHP )
  113. {
  114. reduceHP = this.Owner.CurrentHP - this.Owner.MaxHP;
  115. }
  116. this.onDamage(attacker.Owner, reduceHP);
  117. attacker.onAttack(this.Owner, reduceHP);
  118. }
  119. internal void LogDead(IUnitStatistic attacker)
  120. {
  121. this.onDead(attacker.Owner);
  122. attacker.onKill(this.Owner);
  123. }
  124. internal void LogUseItem(ItemTemplate item)
  125. {
  126. this.onUseItem(item);
  127. }
  128. //------------------------------------------------------------------------------------
  129. }
  130. //------------------------------------------------------------------------------------
  131. public class UnitStatistic : IUnitStatistic
  132. {
  133. private int m_DeadCount = 0;
  134. private int m_KillPlayerCount = 0;
  135. private int m_KillUnitCount = 0;
  136. private long m_SelfDamage = 0;
  137. private long m_TotalDamage = 0;
  138. private long m_PlayerDamage = 0;
  139. private long m_TotalHealing = 0;
  140. private long m_PlayerHealing = 0;
  141. //联展信息
  142. private long m_preKillTime = 0;
  143. private short m_continueKills = 0;
  144. private Dictionary<UnitInfo.UnitType, int> m_KillUnitCountMap = new Dictionary<UnitInfo.UnitType, int>();
  145. public UnitStatistic(InstanceUnit owner) : base(owner)
  146. {
  147. }
  148. public override int DeadCount { get { return m_DeadCount; } }
  149. public override int KillPlayerCount { get { return m_KillPlayerCount; } }
  150. public override int KillUnitCount { get { return m_KillUnitCount; } }
  151. public override long SelfDamage { get { return m_SelfDamage; } }
  152. public override long TotalDamage { get { return m_TotalDamage; } }
  153. public override long PlayerDamage { get { return m_PlayerDamage; } }
  154. public override long TotalHealing { get { return m_TotalHealing; } }
  155. public override long PlayerHealing { get { return m_PlayerHealing; } }
  156. /// <summary>
  157. /// 连斩信息
  158. /// </summary>
  159. public override long preKillTime { get { return m_preKillTime; } set { m_preKillTime = value; } }
  160. public override short continueKills { get { return m_continueKills; } set { m_continueKills = value; } }
  161. public override int GetKillUnitCount(UnitInfo.UnitType type)
  162. {
  163. int ret = 0;
  164. if (m_KillUnitCountMap.TryGetValue(type, out ret))
  165. return ret;
  166. return 0;
  167. }
  168. public override void onDead(InstanceUnit killer)
  169. {
  170. this.m_DeadCount += 1;
  171. }
  172. public override void onKill(InstanceUnit target)
  173. {
  174. this.m_KillUnitCount += 1;
  175. if (target.IsPlayer) { this.m_KillPlayerCount += 1; }
  176. int count = 0;
  177. if (this.m_KillUnitCountMap.TryGetValue(target.Info.UType, out count))
  178. {
  179. count += 1;
  180. this.m_KillUnitCountMap[target.Info.UType] = count;
  181. }
  182. else
  183. {
  184. this.m_KillUnitCountMap.Add(target.Info.UType, 1);
  185. }
  186. }
  187. public override void onDamage(InstanceUnit attacker, int reduceHP)
  188. {
  189. if (reduceHP > 0)
  190. {
  191. this.m_SelfDamage += reduceHP;
  192. }
  193. }
  194. public override void onAttack(InstanceUnit target, int reduceHP)
  195. {
  196. if (reduceHP > 0)
  197. {
  198. this.m_TotalDamage += reduceHP;
  199. if (target.IsPlayer)
  200. {
  201. this.m_PlayerDamage += reduceHP;
  202. }
  203. }
  204. else
  205. {
  206. this.m_TotalHealing += -reduceHP;
  207. if (target.IsPlayer)
  208. {
  209. this.m_PlayerHealing += -reduceHP;
  210. }
  211. }
  212. }
  213. public override void onUseItem(ItemTemplate item)
  214. {
  215. }
  216. }
  217. //
  218. // public class UnitStatistic
  219. // {
  220. // public readonly InstanceUnit Owner;
  221. //
  222. // private int mTotalTakeMoney = 0;
  223. //
  224. // //自身受到的伤害.
  225. // private long mSelfDamage;
  226. // //对怪物输出的伤害.
  227. // private long mMonsterDamage;
  228. // //对玩家输出伤害.
  229. // private long mPlayerDamage;
  230. //
  231. // //治疗回复血量.
  232. // private long mSelfHealing;
  233. // //怪物造成的治疗量.
  234. // private long mMonsterHealing;
  235. // //玩家造成的治疗量.
  236. // private long mPlayerHealing;
  237. //
  238. //
  239. // private int mDeadCount;
  240. // private int mKillPlayerCount;
  241. // private int mKillUnitCount;
  242. //
  243. // private HashMap<UnitInfo.UnitType, int> mKillUnitCountMap = new HashMap<UnitInfo.UnitType, int>();
  244. //
  245. // private List<int> mKilledEllitMonsters = new List<int>();
  246. //
  247. // private List<int> mUseItems = new List<int>();
  248. //
  249. // public UnitStatistic(InstanceUnit owner)
  250. // {
  251. // Owner = owner;
  252. // }
  253. //
  254. // protected internal virtual void onDead()
  255. // {
  256. // mDeadCount += 1;
  257. // }
  258. //
  259. // protected internal virtual void onHitAttack(InstanceUnit self, InstanceUnit sender, int reduceHP)
  260. // {
  261. // //伤害.
  262. // if (reduceHP > 0)
  263. // {
  264. // mSelfDamage += reduceHP;
  265. // if (self is InstancePlayer)
  266. // {
  267. // sender.Statistic.mOutPlayerDamage += reduceHP;
  268. // }
  269. // else
  270. // {
  271. // sender.Statistic.mOutMonsterDamage += reduceHP;
  272. // }
  273. // }
  274. // else if (reduceHP < 0)//治疗量.
  275. // {
  276. // mSelfHealingPerSecond += -reduceHP;
  277. // if (self is InstancePlayer)
  278. // {
  279. // sender.Statistic.mOutPlayerHealingPerSecond += -reduceHP;
  280. // }
  281. // else
  282. // {
  283. // sender.Statistic.mOutMonsterHealingPerSecond += -reduceHP;
  284. // }
  285. // }
  286. // else
  287. // {
  288. // return;
  289. // }
  290. //
  291. // if (self.IsDead)
  292. // {
  293. // sender.Statistic.addKillUnit(self);
  294. //
  295. // sender.Statistic.mTotalTakeMoney += self.Info.DropMoney;
  296. // }
  297. // }
  298. //
  299. // protected internal virtual void onUseItem(InstanceUnit self, ItemTemplate item)
  300. // {
  301. // mUseItems.Add(item.ID);
  302. // }
  303. //
  304. //
  305. //
  306. //
  307. // private void addKillUnit(InstanceUnit unit)
  308. // {
  309. // mKillUnitCount += 1;
  310. //
  311. // if (unit is InstancePlayer)
  312. // {
  313. // mKillPlayerCount += 1;
  314. // }
  315. // else if (unit.Info.IsElite)
  316. // {
  317. // mKilledEllitMonsters.Add(unit.Info.ID);
  318. // }
  319. //
  320. // UnitInfo.UnitType type = unit.Info.UType;
  321. // if (!mKillUnitCountMap.ContainsKey(type))
  322. // {
  323. // mKillUnitCountMap[type] = 1;
  324. // }
  325. // else
  326. // {
  327. // mKillUnitCountMap[type] = (mKillUnitCountMap[type] + 1);
  328. // }
  329. // }
  330. //
  331. //
  332. //
  333. // /// <summary>
  334. // /// 获取的金币数量
  335. // /// </summary>
  336. // public int TotalTakeMoney
  337. // {
  338. // get
  339. // {
  340. // return mTotalTakeMoney;
  341. // }
  342. // }
  343. //
  344. //
  345. // /// <summary>
  346. // /// 死亡次数
  347. // /// </summary>
  348. // public int DeadCount
  349. // {
  350. // get
  351. // {
  352. // return mDeadCount;
  353. // }
  354. // }
  355. //
  356. // /// <summary>
  357. // /// 承受伤害
  358. // /// </summary>
  359. // public long SelfDamage
  360. // {
  361. // get
  362. // {
  363. // return mSelfDamage;
  364. // }
  365. // }
  366. //
  367. // /// <summary>
  368. // /// 使用的所有道具 编辑器道具ID[]
  369. // /// </summary>
  370. // public int[] UseItems
  371. // {
  372. // get
  373. // {
  374. // return mUseItems.ToArray();
  375. // }
  376. // }
  377. //
  378. // /// <summary>
  379. // /// 总共杀死玩家数量
  380. // /// </summary>
  381. // public int KillPlayerCount
  382. // {
  383. // get
  384. // {
  385. // return mKillPlayerCount;
  386. // }
  387. // }
  388. //
  389. // public int KillUnitCount
  390. // {
  391. // get
  392. // {
  393. // return mKillUnitCount;
  394. // }
  395. // }
  396. //
  397. // /// <summary>
  398. // /// 杀死精英怪物 编辑器单位ID[]
  399. // /// </summary>
  400. // public int[] KilledEllitMonsters
  401. // {
  402. // get
  403. // {
  404. // return mKilledEllitMonsters.ToArray();
  405. // }
  406. // }
  407. //
  408. // /// <summary>
  409. // /// 对怪物造成的总伤害
  410. // /// </summary>
  411. // public long MonsterDamage
  412. // {
  413. // get
  414. // {
  415. // return mOutMonsterDamage;
  416. // }
  417. // }
  418. //
  419. // /// <summary>
  420. // /// 对玩家造成的总伤害
  421. // /// </summary>
  422. // public long PlayerDamage
  423. // {
  424. // get
  425. // {
  426. // return mOutPlayerDamage;
  427. // }
  428. // }
  429. // //治疗回复血量.
  430. // public long SelfHealingPerSecond
  431. // {
  432. // get
  433. // {
  434. // return mSelfHealingPerSecond;
  435. // }
  436. // }
  437. // //玩家造成的治疗量.
  438. // public long PlayerHealingPerSecond
  439. // {
  440. // get
  441. // {
  442. // return mOutPlayerHealingPerSecond;
  443. // }
  444. // }
  445. // //怪物造成的治疗量.
  446. // public long MonsterHealingPerSecond
  447. // {
  448. // get
  449. // {
  450. // return mOutMonsterHealingPerSecond;
  451. // }
  452. // }
  453. //
  454. // /// <summary>
  455. // /// 总共杀死怪物数量
  456. // /// </summary>
  457. // public int GetKillUnitCount(UnitInfo.UnitType type)
  458. // {
  459. // if (mKillUnitCountMap.ContainsKey(type))
  460. // {
  461. // return mKillUnitCountMap[type];
  462. // }
  463. // return 0;
  464. // }
  465. //
  466. // public UnitStatisticData ToUnitStatisticData()
  467. // {
  468. // var rst = new UnitStatisticData();
  469. // rst.ObjectID = Owner.ID;
  470. // rst.DeadCount = this.DeadCount;
  471. // rst.ItemTemplates = this.UseItems;
  472. // rst.KillUnitCount = this.KillUnitCount;
  473. // rst.KillEnemyCount = this.GetKillUnitCount(UnitInfo.UnitType.TYPE_MONSTER);
  474. // rst.KillNeutralityCount = this.GetKillUnitCount(UnitInfo.UnitType.TYPE_NEUTRALITY);
  475. // rst.KillBuildingCount = this.GetKillUnitCount(UnitInfo.UnitType.TYPE_BUILDING);
  476. // rst.KillPlayerCount = this.KillPlayerCount;
  477. // rst.MonsterDamage = this.MonsterDamage;
  478. // rst.PlayerDamage = this.PlayerDamage;
  479. // rst.SelfDamage = this.SelfDamage;
  480. // rst.TotalTakeMoney = this.TotalTakeMoney;
  481. // rst.KilledEllitMonsters = this.KilledEllitMonsters;
  482. // if (Owner is InstancePlayer)
  483. // {
  484. // // 统计杀死玩家 //
  485. // rst.KillPlayers = (Owner as InstancePlayer).KilledPlayersID;
  486. //
  487. // }
  488. // return rst;
  489. // }
  490. //
  491. // public RoomFinishInfoB2R.PlayerResult ToUnitStatisticDataServer()
  492. // {
  493. // RoomFinishInfoB2R.PlayerResult rst = new RoomFinishInfoB2R.PlayerResult();
  494. // rst.ZoneObjectID = Owner.ID;
  495. // rst.Force = Owner.Force;
  496. // rst.DeadCount = this.DeadCount;
  497. // rst.ItemTemplates = this.UseItems;
  498. // rst.KillUnitCount = this.KillUnitCount;
  499. // rst.KillEnemyCount = this.GetKillUnitCount(UnitInfo.UnitType.TYPE_MONSTER);
  500. // rst.KillNeutralityCount = this.GetKillUnitCount(UnitInfo.UnitType.TYPE_NEUTRALITY);
  501. // rst.KillBuildingCount = this.GetKillUnitCount(UnitInfo.UnitType.TYPE_BUILDING);
  502. // rst.KillPlayerCount = this.KillPlayerCount;
  503. // rst.MonsterDamage = this.MonsterDamage;
  504. // rst.PlayerDamage = this.PlayerDamage;
  505. // rst.SelfDamage = this.SelfDamage;
  506. // rst.TotalTakeMoney = this.TotalTakeMoney;
  507. // rst.KilledEllitMonsters = this.KilledEllitMonsters;
  508. // // 统计杀死玩家 //
  509. // if (Owner is InstancePlayer)
  510. // {
  511. // var p = Owner as InstancePlayer;
  512. // rst.KillPlayers = p.KilledPlayersID;
  513. // rst.PlayerUUID = p.PlayerUUID;
  514. // }
  515. // return rst;
  516. // }
  517. // public void FromUnitStatisticDataServer(RoomFinishInfoB2R.PlayerResult rst)
  518. // {
  519. // this.mDeadCount = rst.DeadCount;
  520. // this.mUseItems = new List<int>(rst.ItemTemplates);
  521. // this.mKillUnitCount = rst.KillUnitCount;
  522. // this.mKillUnitCountMap.Put(UnitInfo.UnitType.TYPE_MONSTER, rst.KillEnemyCount);
  523. // this.mKillUnitCountMap.Put(UnitInfo.UnitType.TYPE_NEUTRALITY, rst.KillNeutralityCount);
  524. // this.mKillUnitCountMap.Put(UnitInfo.UnitType.TYPE_BUILDING, rst.KillBuildingCount);
  525. // this.mKillPlayerCount = rst.KillPlayerCount;
  526. // this.mOutMonsterDamage = rst.MonsterDamage;
  527. // this.mOutPlayerDamage = rst.PlayerDamage;
  528. // this.mSelfDamage = rst.SelfDamage;
  529. // this.mTotalTakeMoney = rst.TotalTakeMoney;
  530. // this.mKilledEllitMonsters = new List<int>(rst.KilledEllitMonsters);
  531. // // 统计杀死玩家 //
  532. // if (Owner is InstancePlayer)
  533. // {
  534. // var p = Owner as InstancePlayer;
  535. // foreach (var uuid in rst.KillPlayers)
  536. // {
  537. // p.PutKillPlayer(uuid);
  538. // }
  539. // }
  540. // }
  541. // }
  542. }