IFormulas.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using CommonLang.Log;
  5. using System.Xml;
  6. using System.IO;
  7. using CommonAI.Zone.ZoneEditor;
  8. using CommonLang.Concurrent;
  9. using CommonLang;
  10. using CommonAI.Zone.UnitTriggers;
  11. using CommonAI.Zone.Instance;
  12. using CommonLang.XCSV;
  13. using static CommonAI.Zone.Instance.InstanceUnit;
  14. using CommonAI.Data;
  15. using CommonAI.Zone.Helper;
  16. using CommonAI.ZoneServer.JSGModule;
  17. namespace CommonAI.Zone.Formula
  18. {
  19. public class AttackSource
  20. {
  21. /// <summary>
  22. /// 攻击属性.
  23. /// </summary>
  24. public readonly AttackProp Attack;
  25. /// <summary>
  26. /// 技能模板.
  27. /// </summary>
  28. public readonly SkillTemplate FromSkill;
  29. /// <summary>
  30. /// 法术模板.
  31. /// </summary>
  32. public readonly SpellTemplate FromSpell;
  33. /// <summary>
  34. /// BUFF模板.
  35. /// </summary>
  36. public readonly BuffTemplate FromBuff;
  37. /// <summary>
  38. /// 技能实际状态.
  39. /// </summary>
  40. public readonly InstanceUnit.SkillState FromSkillState;
  41. /// <summary>
  42. /// BUFF实际状态.
  43. /// </summary>
  44. public readonly InstanceUnit.BuffState FromBuffState;
  45. /// <summary>
  46. /// 法术实际状态.
  47. /// </summary>
  48. public readonly InstanceSpell FromSpellUnit;
  49. /// <summary>
  50. /// 如果是技能产生的伤害,就是该技能的类型(就算是法术,也要追根到技能)
  51. /// </summary>
  52. public readonly XmdsSkillType FromSkillType = XmdsSkillType.none;
  53. /// <summary>
  54. /// 是否发送协议
  55. /// </summary>
  56. public bool OutSendEvent = true;
  57. /// <summary>
  58. /// 是否命中
  59. /// </summary>
  60. public bool OutHitted;
  61. /// <summary>
  62. /// 是否产生硬直.
  63. /// </summary>
  64. public bool OutIsDamage;
  65. /// <summary>
  66. /// 是否击溃.
  67. /// </summary>
  68. public bool OutIsCrush;
  69. /// <summary>
  70. /// 是否击飞.
  71. /// </summary>
  72. public bool OutHasFly;
  73. /// <summary>
  74. /// 是否击倒.
  75. /// </summary>
  76. public bool OutHasKnockDown;
  77. /// <summary>
  78. /// 击倒时间.
  79. /// </summary>
  80. public int OutKnockDownTimeMS;
  81. /// <summary>
  82. /// 打击特效.
  83. /// </summary>
  84. public LaunchEffect OutHitEffect;
  85. public float OutWeight;
  86. public StartMove OutHitMove;
  87. /// <summary>
  88. /// 扩展模块用于特殊计算.
  89. /// </summary>
  90. public object OutExtendsResult;
  91. /// <summary>
  92. /// 用于表示攻击特殊状态:招架、闪避、反伤, UnitHitEventState
  93. /// </summary>
  94. public byte OutClientState;
  95. public int OutClientStateExt;
  96. // 特殊逻辑
  97. public int ignoreDef;
  98. // 技能或者法术的一次ATTACK是否有击中,只有有一个击中也算
  99. private bool hasHitted;
  100. public bool HasHitted { get { return hasHitted; } set {
  101. if(value && !hasHitted)
  102. {
  103. callHitTarget();
  104. }
  105. hasHitted = value;
  106. }
  107. }
  108. public AttackSource(InstanceUnit.SkillState skill, AttackProp attack)
  109. {
  110. this.Attack = attack;
  111. this.FromSkill = skill.Data;
  112. this.FromSkillState = skill;
  113. this.FromSpell = null;
  114. this.FromSpellUnit = null;
  115. this.FromBuff = null;
  116. this.FromBuffState = null;
  117. this.FromSkillType = skill.GetSkillType();
  118. }
  119. public AttackSource(InstanceUnit.BuffState buff, AttackProp attack)
  120. {
  121. this.Attack = attack;
  122. this.FromSkill = null;
  123. this.FromSkillState = null;
  124. this.FromSpell = null;
  125. this.FromSpellUnit = null;
  126. this.FromBuff = buff.Data;
  127. this.FromBuffState = buff;
  128. }
  129. public AttackSource(InstanceSpell spell, AttackProp attack)
  130. {
  131. this.Attack = attack;
  132. this.FromSkill = null;
  133. this.FromSkillState = null;
  134. this.FromSpell = spell.Info;
  135. this.FromSpellUnit = spell;
  136. this.FromBuff = null;
  137. this.FromBuffState = null;
  138. this.FromSkillType = spell.FromSkillType;
  139. }
  140. public void Begin(InstanceUnit target)
  141. {
  142. this.OutIsCrush = CUtils.RandomPercent(target.RandomN, Attack.CrushPercent);
  143. this.OutHitEffect = Attack.Effect;
  144. this.OutWeight = (Attack.Weight - target.Weight);
  145. this.OutIsDamage = (OutWeight > 0) && (Attack.MaskDamage) && (!target.IsNoneBlock);
  146. this.OutHitted = true;
  147. if (OutIsDamage)
  148. {
  149. this.OutHasFly = Attack.MaskHitFly;
  150. this.OutHasKnockDown = Attack.MaskKnockDown;
  151. this.OutKnockDownTimeMS = Attack.KnockOutTimeMS;
  152. this.OutHitMove = Attack.HitMove;
  153. }
  154. else
  155. {
  156. this.OutHasFly = false;
  157. this.OutHasKnockDown = false;
  158. this.OutKnockDownTimeMS = 0;
  159. this.OutHitMove = null;
  160. }
  161. if (this.FromSpellUnit != null && this.FromSpellUnit.ChainInfo != null)
  162. {
  163. this.FromSpellUnit.ChainInfo.AddTarget(target);
  164. }
  165. }
  166. public ITemplateData Weapon
  167. {
  168. get
  169. {
  170. if (FromSkill != null) { return FromSkill; }
  171. if (FromSpell != null) { return FromSpell; }
  172. if (FromBuff != null) { return FromBuff; }
  173. return null;
  174. }
  175. }
  176. public AttackSource GenAttackSource(AttackProp attack)
  177. {
  178. if (FromSkillState != null)
  179. {
  180. return new AttackSource(this.FromSkillState, attack);
  181. }
  182. if (FromBuffState != null)
  183. {
  184. return new AttackSource(this.FromBuffState, attack);
  185. }
  186. if (FromSpellUnit != null)
  187. {
  188. return new AttackSource(this.FromSpellUnit, attack);
  189. }
  190. return null;
  191. }
  192. public SkillTemplate.CastTarget FromExpectTarget
  193. {
  194. get
  195. {
  196. if (FromSkill != null)
  197. {
  198. return FromSkill.ExpectTarget;
  199. }
  200. if (FromSpell != null)
  201. {
  202. return FromSpell.ExpectTarget;
  203. }
  204. return SkillTemplate.CastTarget.NA;
  205. }
  206. }
  207. public void callHitTarget()
  208. {
  209. InstanceUnit attacker = null;
  210. if (FromSkillState != null)
  211. {
  212. attacker = FromSkillState.Owner;
  213. }
  214. else if (FromSpellUnit !=null)
  215. {
  216. attacker = FromSpellUnit.Launcher;
  217. }
  218. if (attacker != null)
  219. attacker.onSkillHitTarget();
  220. }
  221. }
  222. public interface IVirtualUnit
  223. {
  224. void OnInit(InstanceUnit owner, bool pointLv);
  225. void OnDispose(InstanceUnit owner);
  226. bool ChangeSkill(int oldSkillID, int newSkillID, SkillLevelData data);
  227. //设置战斗属性
  228. void SyncBattlePropsFields(ulong mask);
  229. /////////////////////////////////////////////////////////////////////////////
  230. //玩家的一些接口暴露给comAI
  231. //是否是PVP, PVE状态
  232. BattleStatus GetBattleStatus();
  233. int GetInventorySize();
  234. bool IsInPVP();
  235. bool IsInPVE();
  236. //设置玩家战斗状态
  237. void SetCombatState(BattleStatus value, byte reason = 0, string pvpTriggerID = "");
  238. //是否是队友
  239. bool IsAllies(IVirtualUnit target, bool includeSelf = true, bool onlyForTeam = false);
  240. //Instance行为调用virtual
  241. void doEvent(JSGCustomOpType type);
  242. void TakeOffMount();
  243. void SendMsgToClient(string msg);
  244. void SendMsgToPlayer(ObjectEvent evt, bool force = false);
  245. //获取阵营id
  246. int GetForceID();
  247. //获取工会id
  248. string GetGuildID();
  249. //是否是工会成员
  250. bool IsGuildMember(string id);
  251. //获取pk等级
  252. PKLevel GetCurPKLevel();
  253. //是否是同服务器
  254. bool IsServerMember(int id);
  255. //获取服务器id
  256. int GetServerID();
  257. //获取基础技能id
  258. int GetBaseSkillID();
  259. /** 获取PK模式 */
  260. PKMode GetCurPKMode();
  261. /** 获得被治疗效果 */
  262. int GetHealedEffect();
  263. /** 获得治疗效果 */
  264. int GetHealEffect();
  265. /** 获得单位职业 */
  266. XmdsUnitPro GetUnitPro();
  267. //性别: 0-男,1-女
  268. int GetUnitSex();
  269. /** 获得宠物天赋加成 */
  270. int GetPetTalentAddition(UnitFateType type);
  271. /** 获得单位天赋 */
  272. UnitFateType GetUnitFateType();
  273. /** 是否在安全区 */
  274. bool IsInSafeArea();
  275. bool LaunchSkillCheckTalentInfo(InstanceUnit.SkillState skill);
  276. /** 分发技能被打断事件(暂时只有移动) */
  277. void DispatchSkillBlockEvent(InstanceUnit.StateSkill skill, InstanceUnit.State newState);
  278. /** 分发加血事件 */
  279. int DispatchAddOtherHPEvent(int hp, InstanceUnit sender, AttackSource source);
  280. /** 分发扣定力时间 */
  281. void DispatchAddMPEvent(int mp, InstanceUnit sender, out int finalMP, AttackSource source);
  282. /** 分发法术释放完毕 */
  283. void DispatchSendSpellOverEvent(LaunchSpell launch, SpellTemplate spt, float startX, float startY);
  284. /** 设置技能可用性 */
  285. void SetSkillActive(int skillTemplateID, bool active, bool pause_on_deactive = false);
  286. /** 分发击杀怪物事件 */
  287. bool DispatchKillOtherEvent(IVirtualUnit attacker, IVirtualUnit deader);
  288. /** 获取玩家当前的简要属性信息 */
  289. void OnPlayerKillMonster(InstanceUnit monster);
  290. /////////////////////////////////////////////////////////////////////////////
  291. /////////////////////////////////////////////////////////////////////////////
  292. //怪物的一些接口暴露给comAI
  293. int GetMaType();
  294. bool IsBoss();
  295. uint GetMasterID();
  296. InstanceUnit GetMasterUnit();
  297. void StartRecoverMP(bool reset = false);
  298. bool IsCanReduceMP(bool force);
  299. //获取玩家宠物接口
  300. InstanceUnit GetPetUnit();
  301. }
  302. public interface IVirtualClientUnit
  303. {
  304. void OnInit(ZoneClient.ZoneUnit owner);
  305. void OnDispose(ZoneClient.ZoneUnit owner);
  306. }
  307. public abstract class IFormula
  308. {
  309. //--------------------------------------------------------------------------------------------
  310. #region SYSTEM
  311. /// <summary>
  312. /// 绑定日志系统
  313. /// </summary>
  314. /// <param name="log"></param>
  315. public virtual void BindLogger(Logger log)
  316. {
  317. }
  318. /// <summary>
  319. /// 游戏加载初始化
  320. /// </summary>
  321. /// <param name="data_root"></param>
  322. public virtual void InitPluginsData(EditorTemplates data_root)
  323. {
  324. }
  325. /// <summary>
  326. /// 编辑器保存时
  327. /// </summary>
  328. /// <param name="datas"></param>
  329. /// <param name="data_root"></param>
  330. /// <param name="savedfiles"></param>
  331. /// <param name="progress_percent"></param>
  332. public virtual void OnEditorSaving(EditorTemplatesData datas, DirectoryInfo data_root, List<FileInfo> savedfiles, AtomicFloat progress_percent)
  333. {
  334. }
  335. /// <summary>
  336. /// 列出所有需要转换的XLS文件
  337. /// </summary>
  338. /// <param name="data_root"></param>
  339. /// <param name="xls_files"></param>
  340. public virtual void ListXCSVFiles(DirectoryInfo data_root, List<FileInfo> xls_files)
  341. {
  342. }
  343. /// <summary>
  344. /// 编辑器xls目录保存时
  345. /// </summary>
  346. /// <param name="datas"></param>
  347. /// <param name="xls2csv"></param>
  348. /// <param name="savedfiles"></param>
  349. /// <param name="progress_percent"></param>
  350. public virtual void OnEditorPluginSaved(ZoneEditor.EditorTemplatesData datas, List<XCSVMeta> xls2csv, List<FileInfo> savedfiles, AtomicFloat progress_percent)
  351. {
  352. }
  353. #endregion
  354. //--------------------------------------------------------------------------------------------
  355. #region HIT_AND_DAMAGE
  356. public virtual int OnHit(InstanceUnit attacker, AttackSource attack, InstanceUnit targget) { return attack.Attack.Attack; }
  357. public virtual void OnUnitDead(InstanceUnit targget, InstanceUnit killer) { }
  358. public virtual void OnUnitRemoved(InstanceUnit unit) { }
  359. public virtual bool TryLaunchSkill(InstanceUnit attacker, InstanceUnit.SkillState skill, ref InstanceUnit.LaunchSkillParam param) { return true; }
  360. public virtual bool TriggerPetSkill(InstanceUnit attacker, InstanceUnit.SkillState skill, ref InstanceUnit.LaunchSkillParam param) { return true; }
  361. public virtual bool TryResetSkill(InstanceUnit owner) { return true; }
  362. public virtual bool TryLaunchSpell(InstanceUnit launcher, LaunchSpell launch, ref SpellTemplate spell, out JSGCreateSpellData createData, ref float startX, ref float startY)
  363. {
  364. createData = null;
  365. return true;
  366. }
  367. public virtual bool TryAddBuff(InstanceUnit owner, InstanceUnit sender, ref BuffTemplate buff, out object tag) { tag = null; return true; }
  368. public virtual bool TryLaunchTrigger(InstanceUnit owner, UnitTriggerTemplate trigger, UnitTriggers.BaseTriggerEvent evt, AttackSource source) { return true; }
  369. public virtual bool TrySummonUnit(InstanceUnit owner, SummonUnit summon, ref UnitInfo summonUnit, ref string name) { return true; }
  370. public virtual bool TryUseItem(InstanceUnit owner, ItemTemplate item, InstanceUnit item_creater) { return true; }
  371. public virtual void SendAddBuffEvent(InstanceUnit owner, InstanceUnit sender, BuffTemplate buff) {}
  372. #endregion
  373. //--------------------------------------------------------------------------------------------
  374. #region STATUS
  375. public virtual void OnTriggerStart(InstanceUnit unit, InstanceUnit.TriggerState trigger, InstanceUnit target) { }
  376. public virtual void OnUpdateTriggerSkill(InstanceUnit unit, int intervalMS, bool slowRefresh) { }
  377. public virtual void OnBuffBegin(InstanceUnit unit, InstanceUnit.BuffState buff, InstanceUnit sender) { }
  378. public virtual void OnBuffUpdate(InstanceUnit unit, InstanceUnit.BuffState buff, int time) { }
  379. public virtual void OnBuffEnd(InstanceUnit unit, InstanceUnit.BuffState buff, string result, bool replace) { }
  380. public virtual void OnGotInventoryItem(InstanceUnit unit, ItemTemplate item) { }
  381. public virtual void OnLostInventoryItem(InstanceUnit unit, ItemTemplate item) { }
  382. public virtual void OnUseItem(InstanceUnit unit, ItemTemplate item, InstanceUnit item_creater) { }
  383. #endregion
  384. //--------------------------------------------------------------------------------------------
  385. #region NET
  386. public virtual void OnZoneHandleNetMessage(InstanceZone zone, Action action) { }
  387. public virtual void OnUnitHandleNetMessage(InstanceUnit unit, ObjectAction action) { }
  388. #endregion
  389. //--------------------------------------------------------------------------------------------
  390. }
  391. }