JSGPlayerCardModule.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. using CommonAI.Data;
  2. using CommonAI.Zone.Formula;
  3. using CommonAI.Zone.Helper;
  4. using CommonAI.ZoneServer.JSGModule;
  5. using CommonLang.Log;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using XmdsCommon.JSGModule;
  12. using XmdsCommon.JSGModule.Interface;
  13. using XmdsCommon.Plugin;
  14. using XmdsCommonServer.Plugin;
  15. using XmdsCommonServer.Plugin.CardSkill;
  16. using XmdsCommonServer.Plugin.CardSkill.PlayerCardSkill;
  17. using XmdsCommonServer.XLS.Data;
  18. namespace XmdsCommonSkill.Plugin.CardSkill
  19. {
  20. /** 玩家卡牌技能模块 */
  21. public class JSGPlayerCardModule : JSGCardModuleBase
  22. {
  23. //protected static Logger log = LoggerFactory.GetLogger("JSGPlayerCardModule");
  24. //玩家卡牌技能信息
  25. private CardSkillData[] mPlayerCardSkill = new CardSkillData[(int)CardType.Max + 1];
  26. //卡牌权重模块
  27. private JSGCardRateModule mCardRateModule = new JSGCardRateModule();
  28. // 上次获得卡牌数据
  29. private GetCardData mLastCardInfo = new GetCardData();
  30. // 卡牌珠下一次强化效果
  31. private JSNextCardSkillStrengthenhModule mNextCardStrengthInfo = new JSNextCardSkillStrengthenhModule();
  32. //玩家数据
  33. private int mCardListTestIndex = 0;
  34. //是否开启
  35. private bool mIsFuncOpen;
  36. public JSGPlayerCardModule(XmdsVirtual owner)
  37. {
  38. //this.Init(owner);
  39. }
  40. protected override bool OnInit(XmdsVirtual owner, bool notifyClient)
  41. {
  42. mIsFuncOpen = false;
  43. if (mCardData == null)
  44. {
  45. mCardData = new JSGPlayerCardData();
  46. }
  47. XmdsUnitProperties prop = owner.mUnit.Properties as XmdsUnitProperties;
  48. if (prop == null || owner.SkillHelper == null || prop.ServerData.CardSkills == null)
  49. {
  50. log.Error("XmdsPlayerCardSkill null : " + owner.mUnit.Parent.GetSceneID() + ", " + owner.mUnit.PlayerUUID);
  51. return false;
  52. }
  53. else if(prop.ServerData.CardSkills.UnitSkills.Count != (int)CardType.Max + 1)
  54. {
  55. log.Error("XmdsPlayerCardSkill init 四象系统技能数量错误 : " + owner.mUnit.Parent.GetSceneID() + ", " + owner.mUnit.PlayerUUID + ", " + prop.ServerData.CardSkills.UnitSkills.Count);
  56. return false;
  57. }
  58. int totalWeight = 0;
  59. String extInfo = "";
  60. for (int i = 0; i <= (int)CardType.Max; i++)
  61. {
  62. GameSkill gs = prop.ServerData.CardSkills.UnitSkills[i];
  63. mPlayerCardSkill[i] = new CardSkillData(gs.SkillID, (CardType)i);
  64. if(!this.InitSkillData(mPlayerCardSkill[i], gs))
  65. {
  66. return false;
  67. }
  68. totalWeight += gs.TalentSkillLevel1;
  69. extInfo = extInfo + ", " + gs.TalentSkillLevel1;
  70. }
  71. String uniqueInfo = owner.mUnit.IsPlayer ? owner.mUnit.PlayerUUID : (owner.mUnit.Parent.GetSceneID() + "_" + owner.mInfo.ID);
  72. log.Info("初始化卡牌:" + uniqueInfo + ", 总权重:" + totalWeight + ", " + extInfo);
  73. this.mIsFuncOpen = totalWeight > 0;
  74. this.ReSet(true, notifyClient);
  75. mCardRateModule.initUniqueInfo(uniqueInfo);
  76. return true;
  77. }
  78. private bool InitSkillData(CardSkillData cardSkillData, GameSkill gs, IJSGCardSkill cardSkill = null)
  79. {
  80. cardSkillData.skill = cardSkill == null ? (this.mOwner.SkillHelper.GetPlayerSkillById(gs.SkillID) as IJSGCardSkill) : cardSkill;;
  81. if (cardSkillData.skill == null)
  82. {
  83. log.Error("初始化玩家卡牌技能异常1: " + this.mOwner.mUnit.PlayerUUID + ", " + gs.SkillID);
  84. //mPlayerCardSkill[i].skilLv = 0;
  85. //mPlayerCardSkill[i].weight = 1000;
  86. return false;
  87. }
  88. XmdsSkillData skillData = XmdsDataMgr.GetInstance().GetXmdsSkillData(gs.SkillID);
  89. if (skillData != null)
  90. {
  91. if (skillData.DamageType == 1)
  92. {
  93. cardSkillData.dmgType = DamageType.Damage;
  94. }
  95. else if (skillData.DamageType == 2)
  96. {
  97. cardSkillData.dmgType = DamageType.Heal;
  98. }
  99. else
  100. {
  101. cardSkillData.dmgType = DamageType.None;
  102. }
  103. }
  104. else
  105. {
  106. log.Error("初始化玩家卡牌技能异常2: " + this.mOwner.mUnit.PlayerUUID + ", " + gs.SkillID);
  107. return false;
  108. }
  109. cardSkillData.skilLv = (short)gs.SkillLevel;
  110. cardSkillData.weight = gs.TalentSkillLevel1;
  111. return true;
  112. }
  113. protected override void ReSet(bool IsInit, bool notifyClient)
  114. {
  115. base.ReSet(IsInit, notifyClient);
  116. if(IsInit)
  117. {
  118. this.mNextCardStrengthInfo.Init();
  119. }
  120. if(!IsInit)
  121. {
  122. this.mCardListTestIndex = 0;
  123. this.mNextGetCardTime = 0;
  124. this.mNextCardStrengthInfo.ReSet();
  125. this.mLastCardInfo.ReSet();
  126. this.mCardData.ReSet(this.mOwner);
  127. }
  128. else if(notifyClient)
  129. {
  130. this.mCardData.RefreshCardInfo(this.mOwner);
  131. }
  132. }
  133. protected override void OnUpdate(XmdsVirtual player, int interval, bool slowRefresh)
  134. {
  135. if (!this.mIsFuncOpen || !slowRefresh)
  136. {
  137. return;
  138. }
  139. this.mNextCardStrengthInfo.Update(player);
  140. this.mCardRateModule.Update();
  141. }
  142. //击中某一单位
  143. public override void OnHitOther(XmdsVirtual hitter, AttackSource source, int damage, DamageType damageType)
  144. {
  145. // 排除自己作用于自己的一切伤害
  146. if (!this.mIsFuncOpen || (damage <= 0) || this.mOwner == hitter)
  147. {
  148. return;
  149. }
  150. if (!base.mIsInitOK || this.mOwner == null || mPlayerCardSkill == null || mNextGetCardTime > CommonLang.CUtils.localTimeMS
  151. || source.FromSkillType == XmdsSkillType.cardSkill || !JSGModule.RandomPrecent(this.mCardCfg.rate))
  152. {
  153. return;
  154. }
  155. mNextGetCardTime = CommonLang.CUtils.localTimeMS + this.mCardCfg.interval;
  156. GenCardData cardData = mCardRateModule.GetRandomCardType(mPlayerCardSkill);
  157. if(cardData == null)
  158. {
  159. log.Warn("JSGPlayerCardModule OnHitOther 没有随机到卡牌:" + this.mOwner.mUnit.PlayerUUID);
  160. return;
  161. }
  162. this.DoPlayerAddCard(cardData, hitter, source, CreateCardBallSource.Normal);
  163. }
  164. //额外增加一个球:指定类型和属性
  165. public override void AddCard(CardType type, int nums)
  166. {
  167. this.DoPlayerAddCard(new GenCardData(type, nums), null, null, CreateCardBallSource.CardLogic);
  168. }
  169. //额外产生一个球:random(true: 使用权重来获取,false: 获得一个权重最高额)
  170. public override void AddCard(int nums, bool useWeight)
  171. {
  172. CardType cardType = mCardRateModule.GetCardByWeight(useWeight);
  173. if (cardType == CardType.Max)
  174. {
  175. log.Warn("JSGPlayerCardModule AddCard 没有随机到卡牌:" + this.mOwner.mUnit.PlayerUUID + ", " + nums);
  176. return;
  177. }
  178. this.DoPlayerAddCard(new GenCardData(cardType, nums), null, null, CreateCardBallSource.CardLogic);
  179. }
  180. //增加某一卡牌权重
  181. public override void ChangeCardWeight(CardType type, CardRateChgType chgType, int value, int validTime,
  182. bool isPrecent = true, int validTimes = -1, int uniqueID = 0)
  183. {
  184. CardRateChgData data = new CardRateChgData();
  185. data.uniqueID = uniqueID;
  186. data.cardType = type;
  187. data.chgType = chgType;
  188. data.isPrecent = isPrecent;
  189. data.value = (short)value;
  190. data.validTime = validTime + CommonLang.CUtils.localTimeMS;
  191. data.validTimes = (short)validTimes;
  192. this.mCardRateModule.AddChanges(data);
  193. }
  194. public override void OnSkillDataChange(GameSkill info)
  195. {
  196. for(int i = 0; i < mPlayerCardSkill.Length; i++)
  197. {
  198. CardSkillData data = mPlayerCardSkill[i];
  199. if(data != null && data.skillId == info.SkillID)
  200. {
  201. data.skilLv = (short)info.SkillLevel;
  202. data.weight = info.TalentSkillLevel1;
  203. break;
  204. }
  205. }
  206. }
  207. public override void OnInitOver(GameSkill info, IJSGCardSkill cardSkill)
  208. {
  209. for (int i = 0; i < mPlayerCardSkill.Length; i++)
  210. {
  211. CardSkillData data = mPlayerCardSkill[i];
  212. if (data != null && data.skillId/100000 == info.SkillID/100000)
  213. {
  214. this.InitSkillData(mPlayerCardSkill[i], info, cardSkill);
  215. if(info.TalentSkillLevel1 > 0 && !this.mIsFuncOpen)
  216. {
  217. this.mIsFuncOpen = true;
  218. }
  219. break;
  220. }
  221. }
  222. }
  223. //玩家增加一个球
  224. private void DoPlayerAddCard(GenCardData cardData, XmdsVirtual hitter, AttackSource source, CreateCardBallSource type)
  225. {
  226. if (!this.mOwner.DispatchTryGetCardBallEvent(this.mOwner, type, cardData.type))
  227. {
  228. return;
  229. }
  230. if (XmdsConfig.Instance.CARD_OPEN_TEST && XmdsConfig.Instance.CARD_GET_LIST.Count > 0)
  231. {
  232. CardType testCardType = XmdsConfig.Instance.CARD_GET_LIST[this.mCardListTestIndex];
  233. log.Warn("出牌调试,使用索引Id: " + this.mCardListTestIndex + ", " + cardData.type + " -> " + testCardType + " 数量:" + cardData.nums);
  234. cardData.type = testCardType;
  235. if ((++this.mCardListTestIndex) >= XmdsConfig.Instance.CARD_GET_LIST.Count) { this.mCardListTestIndex = 0; }
  236. }
  237. #if JSG_CARD_TEST
  238. if (XmdsConfig.Instance.CARD_OPEN_TEST && XmdsConfig.Instance.CARD_GET_LIST.Count > 0)
  239. {
  240. CardType testCardType = XmdsConfig.Instance.CARD_GET_LIST[this.mCardListTestIndex];
  241. log.Warn("出牌调试,使用索引Id: " + this.mCardListTestIndex + ", " + cardData.type + " -> " + testCardType + " 数量:" + cardData.nums);
  242. cardData.type = testCardType;
  243. if ((++this.mCardListTestIndex) >= XmdsConfig.Instance.CARD_GET_LIST.Count) { this.mCardListTestIndex = 0; }
  244. }
  245. else
  246. {
  247. log.Warn("----DoPlayerAddCard: 获得卡牌: " + cardData.type + ", 数量: " + cardData.nums);
  248. }
  249. #endif
  250. CardTriggerResult result = mCardData.AddCard(this.mOwner, cardData);
  251. if (result == null)
  252. {
  253. return;
  254. }
  255. //result.type = CardType.BaiHu;
  256. //result.sameNums = 3;
  257. CardSkillData triggerSkill = mPlayerCardSkill[(int)result.type];
  258. mCardData.SendTriggerInfo(this.mOwner, result, triggerSkill.skillId, result.cardData);
  259. #if JSG_CARD_TEST
  260. log.Warn("----DoPlayerAddCard: 触发卡牌技能: " + result.type + ", 技能ID:" + triggerSkill.skillId + ", 球数:" + result.sameNums);
  261. #endif
  262. //改成延时触发
  263. //triggerSkill.skill.TriggerCardSkill(this.mOwner, hitter, source, triggerSkill, result.sameNums);
  264. //this.mOwner.DispatchTriggerCardSkillEvent(this.mOwner, hitter, result.type, result.sameNums);
  265. base.mTriggerSkillDelay.init(triggerSkill.skill, this.mOwner, hitter, source, triggerSkill, result.sameNums);
  266. //技能释放完成,记录上一次释放的卡牌信息
  267. this.mLastCardInfo.cardType = result.type;
  268. this.mLastCardInfo.time = CommonLang.CUtils.localTimeMS;
  269. }
  270. //重置当前强化效果
  271. public override void TriggerSkillLoadStrength(CardSkillData skillData, int sameNums)
  272. {
  273. this.mNextCardStrengthInfo.TriggerSkillLoadStrength(skillData, sameNums);
  274. }
  275. // 获得特殊效果强化加成
  276. public override IntIntData GetStrengthInfo(CardStrengthenType type)
  277. {
  278. return this.mNextCardStrengthInfo.GetStrengthInfo(type);
  279. }
  280. // 添加下一次强化效果
  281. public override NextCardStrengthenInfo AddNextStrengthInfo(CardType type, CardStrengthenType strenghType, int value1, int value2, int validTime, int validTimes = -1,
  282. byte needSames = 0, DamageType dmgType = DamageType.None, CardLayerRule layerRules = null)
  283. {
  284. return this.mNextCardStrengthInfo.AddStrength(type, strenghType, value1, value2, validTime, validTimes, needSames, dmgType, layerRules);
  285. }
  286. //上一次释放技能信息
  287. public override GetCardData GetLastCardData()
  288. {
  289. return this.mLastCardInfo;
  290. }
  291. }
  292. }