IFormulas.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  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. //内部扩展使用,伤害额外叠加倍数
  101. public float mDmgAddPer;
  102. public bool HasHitted { get { return hasHitted; } set {
  103. if(value && !hasHitted)
  104. {
  105. callHitTarget();
  106. }
  107. hasHitted = value;
  108. }
  109. }
  110. public AttackSource(InstanceUnit.SkillState skill, AttackProp attack)
  111. {
  112. this.Attack = attack;
  113. this.FromSkill = skill.Data;
  114. this.FromSkillState = skill;
  115. this.FromSpell = null;
  116. this.FromSpellUnit = null;
  117. this.FromBuff = null;
  118. this.FromBuffState = null;
  119. this.FromSkillType = skill.GetSkillType();
  120. }
  121. public AttackSource(InstanceUnit.BuffState buff, AttackProp attack)
  122. {
  123. this.Attack = attack;
  124. this.FromSkill = null;
  125. this.FromSkillState = null;
  126. this.FromSpell = null;
  127. this.FromSpellUnit = null;
  128. this.FromBuff = buff.Data;
  129. this.FromBuffState = buff;
  130. }
  131. public AttackSource(InstanceSpell spell, AttackProp attack)
  132. {
  133. this.Attack = attack;
  134. this.FromSkill = null;
  135. this.FromSkillState = null;
  136. this.FromSpell = spell.Info;
  137. this.FromSpellUnit = spell;
  138. this.FromBuff = null;
  139. this.FromBuffState = null;
  140. this.FromSkillType = spell.FromSkillType;
  141. }
  142. public void Begin(InstanceUnit target)
  143. {
  144. this.OutIsCrush = CUtils.RandomPercent(target.RandomN, Attack.CrushPercent);
  145. this.OutHitEffect = Attack.Effect;
  146. this.OutWeight = (Attack.Weight - target.Weight);
  147. this.OutIsDamage = (OutWeight > 0) && (Attack.MaskDamage) && (!target.IsNoneBlock);
  148. this.OutHitted = true;
  149. if (OutIsDamage)
  150. {
  151. this.OutHasFly = Attack.MaskHitFly;
  152. this.OutHasKnockDown = Attack.MaskKnockDown;
  153. this.OutKnockDownTimeMS = Attack.KnockOutTimeMS;
  154. this.OutHitMove = Attack.HitMove;
  155. }
  156. else
  157. {
  158. this.OutHasFly = false;
  159. this.OutHasKnockDown = false;
  160. this.OutKnockDownTimeMS = 0;
  161. this.OutHitMove = null;
  162. }
  163. if (this.FromSpellUnit != null && this.FromSpellUnit.ChainInfo != null)
  164. {
  165. this.FromSpellUnit.ChainInfo.AddTarget(target);
  166. }
  167. }
  168. public ITemplateData Weapon
  169. {
  170. get
  171. {
  172. if (FromSkill != null) { return FromSkill; }
  173. if (FromSpell != null) { return FromSpell; }
  174. if (FromBuff != null) { return FromBuff; }
  175. return null;
  176. }
  177. }
  178. public AttackSource GenAttackSource(AttackProp attack)
  179. {
  180. if (FromSkillState != null)
  181. {
  182. return new AttackSource(this.FromSkillState, attack);
  183. }
  184. if (FromBuffState != null)
  185. {
  186. return new AttackSource(this.FromBuffState, attack);
  187. }
  188. if (FromSpellUnit != null)
  189. {
  190. return new AttackSource(this.FromSpellUnit, attack);
  191. }
  192. return null;
  193. }
  194. public SkillTemplate.CastTarget FromExpectTarget
  195. {
  196. get
  197. {
  198. if (FromSkill != null)
  199. {
  200. return FromSkill.ExpectTarget;
  201. }
  202. if (FromSpell != null)
  203. {
  204. return FromSpell.ExpectTarget;
  205. }
  206. return SkillTemplate.CastTarget.NA;
  207. }
  208. }
  209. public void callHitTarget()
  210. {
  211. InstanceUnit attacker = null;
  212. if (FromSkillState != null)
  213. {
  214. attacker = FromSkillState.Owner;
  215. }
  216. else if (FromSpellUnit !=null)
  217. {
  218. attacker = FromSpellUnit.Launcher;
  219. }
  220. if (attacker != null)
  221. attacker.onSkillHitTarget();
  222. }
  223. }
  224. public interface IVirtualUnit
  225. {
  226. void OnInit(InstanceUnit owner, bool pointLv);
  227. void OnDispose(InstanceUnit owner);
  228. bool ChangeSkill(int oldSkillID, int newSkillID, SkillLevelData data);
  229. //设置战斗属性
  230. void SyncBattlePropsFields(ulong mask);
  231. /////////////////////////////////////////////////////////////////////////////
  232. //玩家的一些接口暴露给comAI
  233. //是否是PVP, PVE状态
  234. BattleStatus GetBattleStatus();
  235. int GetInventorySize();
  236. bool IsInPVP();
  237. bool IsInPVE();
  238. //设置玩家战斗状态
  239. void SetCombatState(BattleStatus value, byte reason = 0, string pvpTriggerID = "");
  240. //是否是队友
  241. bool IsAllies(IVirtualUnit target, bool includeSelf = true, bool onlyForTeam = false);
  242. //Instance行为调用virtual
  243. void doEvent(JSGCustomOpType type);
  244. void TakeOffMount();
  245. void SendMsgToClient(string msg);
  246. void SendMsgToPlayer(ObjectEvent evt, bool force = false);
  247. //获取阵营id
  248. int GetForceID();
  249. //获取工会id
  250. string GetGuildID();
  251. //是否是工会成员
  252. bool IsGuildMember(string id);
  253. //获取pk等级
  254. PKLevel GetCurPKLevel();
  255. //是否是同服务器
  256. bool IsServerMember(int id);
  257. //获取服务器id
  258. int GetServerID();
  259. //获取基础技能id
  260. int GetBaseSkillID();
  261. /** 获取PK模式 */
  262. PKMode GetCurPKMode();
  263. /** 获得被治疗效果 */
  264. int GetHealedEffect();
  265. /** 获得治疗效果 */
  266. int GetHealEffect();
  267. /** 获得单位职业 */
  268. XmdsUnitPro GetUnitPro();
  269. //性别: 0-男,1-女
  270. int GetUnitSex();
  271. /** 获得宠物天赋加成 */
  272. int GetPetTalentAddition(UnitFateType type);
  273. /** 获得单位天赋 */
  274. UnitFateType GetUnitFateType();
  275. /** 是否在安全区 */
  276. bool IsInSafeArea();
  277. bool LaunchSkillCheckTalentInfo(InstanceUnit.SkillState skill);
  278. /** 分发技能被打断事件(暂时只有移动) */
  279. void DispatchSkillBlockEvent(InstanceUnit.StateSkill skill, InstanceUnit.State newState);
  280. /** 分发加血事件 */
  281. int DispatchAddOtherHPEvent(int hp, InstanceUnit sender, AttackSource source);
  282. /** 分发扣定力时间 */
  283. void DispatchAddMPEvent(int mp, InstanceUnit sender, out int finalMP, AttackSource source);
  284. /** 分发法术释放完毕 */
  285. void DispatchSendSpellOverEvent(LaunchSpell launch, SpellTemplate spt, float startX, float startY);
  286. /** 设置技能可用性 */
  287. void SetSkillActive(int skillTemplateID, bool active, bool pause_on_deactive = false);
  288. /** 分发击杀怪物事件 */
  289. bool DispatchKillOtherEvent(IVirtualUnit attacker, IVirtualUnit deader);
  290. /** 获取玩家当前的简要属性信息 */
  291. void OnPlayerKillMonster(InstanceUnit monster);
  292. /////////////////////////////////////////////////////////////////////////////
  293. /////////////////////////////////////////////////////////////////////////////
  294. //怪物的一些接口暴露给comAI
  295. int GetMaType();
  296. bool IsBoss();
  297. uint GetMasterID();
  298. InstanceUnit GetMasterUnit();
  299. void StartRecoverMP(bool reset = false);
  300. bool IsCanReduceMP(bool force);
  301. //获取玩家宠物接口
  302. InstanceUnit GetPetUnit();
  303. }
  304. public interface IVirtualClientUnit
  305. {
  306. void OnInit(ZoneClient.ZoneUnit owner);
  307. void OnDispose(ZoneClient.ZoneUnit owner);
  308. }
  309. public abstract class IFormula
  310. {
  311. //--------------------------------------------------------------------------------------------
  312. #region SYSTEM
  313. /// <summary>
  314. /// 绑定日志系统
  315. /// </summary>
  316. /// <param name="log"></param>
  317. public virtual void BindLogger(Logger log)
  318. {
  319. }
  320. /// <summary>
  321. /// 游戏加载初始化
  322. /// </summary>
  323. /// <param name="data_root"></param>
  324. public virtual void InitPluginsData(EditorTemplates data_root)
  325. {
  326. }
  327. /// <summary>
  328. /// 编辑器保存时
  329. /// </summary>
  330. /// <param name="datas"></param>
  331. /// <param name="data_root"></param>
  332. /// <param name="savedfiles"></param>
  333. /// <param name="progress_percent"></param>
  334. public virtual void OnEditorSaving(EditorTemplatesData datas, DirectoryInfo data_root, List<FileInfo> savedfiles, AtomicFloat progress_percent)
  335. {
  336. }
  337. /// <summary>
  338. /// 列出所有需要转换的XLS文件
  339. /// </summary>
  340. /// <param name="data_root"></param>
  341. /// <param name="xls_files"></param>
  342. public virtual void ListXCSVFiles(DirectoryInfo data_root, List<FileInfo> xls_files)
  343. {
  344. }
  345. /// <summary>
  346. /// 编辑器xls目录保存时
  347. /// </summary>
  348. /// <param name="datas"></param>
  349. /// <param name="xls2csv"></param>
  350. /// <param name="savedfiles"></param>
  351. /// <param name="progress_percent"></param>
  352. public virtual void OnEditorPluginSaved(ZoneEditor.EditorTemplatesData datas, List<XCSVMeta> xls2csv, List<FileInfo> savedfiles, AtomicFloat progress_percent)
  353. {
  354. }
  355. #endregion
  356. //--------------------------------------------------------------------------------------------
  357. #region HIT_AND_DAMAGE
  358. public virtual int OnHit(InstanceUnit attacker, AttackSource attack, InstanceUnit targget) { return attack.Attack.Attack; }
  359. public virtual void OnUnitDead(InstanceUnit targget, InstanceUnit killer) { }
  360. public virtual void OnUnitRemoved(InstanceUnit unit) { }
  361. public virtual bool TryLaunchSkill(InstanceUnit attacker, InstanceUnit.SkillState skill, ref InstanceUnit.LaunchSkillParam param) { return true; }
  362. public virtual bool TriggerPetSkill(InstanceUnit attacker, InstanceUnit.SkillState skill, ref InstanceUnit.LaunchSkillParam param) { return true; }
  363. public virtual bool TryResetSkill(InstanceUnit owner) { return true; }
  364. public virtual bool TryLaunchSpell(InstanceUnit launcher, LaunchSpell launch, ref SpellTemplate spell, out JSGCreateSpellData createData, ref float startX, ref float startY)
  365. {
  366. createData = null;
  367. return true;
  368. }
  369. public virtual bool TryAddBuff(InstanceUnit owner, InstanceUnit sender, ref BuffTemplate buff, out object tag) { tag = null; return true; }
  370. public virtual bool TryLaunchTrigger(InstanceUnit owner, UnitTriggerTemplate trigger, UnitTriggers.BaseTriggerEvent evt, AttackSource source) { return true; }
  371. public virtual bool TrySummonUnit(InstanceUnit owner, SummonUnit summon, ref UnitInfo summonUnit, ref string name) { return true; }
  372. public virtual bool TryUseItem(InstanceUnit owner, ItemTemplate item, InstanceUnit item_creater) { return true; }
  373. public virtual void SendAddBuffEvent(InstanceUnit owner, InstanceUnit sender, BuffTemplate buff) {}
  374. #endregion
  375. //--------------------------------------------------------------------------------------------
  376. #region STATUS
  377. public virtual void OnTriggerStart(InstanceUnit unit, InstanceUnit.TriggerState trigger, InstanceUnit target) { }
  378. public virtual void OnUpdateTriggerSkill(InstanceUnit unit, int intervalMS, bool slowRefresh) { }
  379. public virtual void OnBuffBegin(InstanceUnit unit, InstanceUnit.BuffState buff, InstanceUnit sender) { }
  380. public virtual void OnBuffUpdate(InstanceUnit unit, InstanceUnit.BuffState buff, int time) { }
  381. public virtual void OnBuffEnd(InstanceUnit unit, InstanceUnit.BuffState buff, string result, bool replace) { }
  382. public virtual void OnGotInventoryItem(InstanceUnit unit, ItemTemplate item) { }
  383. public virtual void OnLostInventoryItem(InstanceUnit unit, ItemTemplate item) { }
  384. public virtual void OnUseItem(InstanceUnit unit, ItemTemplate item, InstanceUnit item_creater) { }
  385. #endregion
  386. //--------------------------------------------------------------------------------------------
  387. #region NET
  388. public virtual void OnZoneHandleNetMessage(InstanceZone zone, Action action) { }
  389. public virtual void OnUnitHandleNetMessage(InstanceUnit unit, ObjectAction action) { }
  390. #endregion
  391. //--------------------------------------------------------------------------------------------
  392. }
  393. }