JSGPlayerCardModule.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  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)
  144. {
  145. if (!this.mIsFuncOpen)
  146. {
  147. return;
  148. }
  149. if (!base.mIsInitOK || this.mOwner == null || mPlayerCardSkill == null || mNextGetCardTime > CommonLang.CUtils.localTimeMS
  150. || source.FromSkillType == XmdsSkillType.cardSkill || !JSGModule.RandomPrecent(this.mCardCfg.rate))
  151. {
  152. return;
  153. }
  154. mNextGetCardTime = CommonLang.CUtils.localTimeMS + this.mCardCfg.interval;
  155. GenCardData cardData = mCardRateModule.GetRandomCardType(mPlayerCardSkill);
  156. if(cardData == null)
  157. {
  158. log.Warn("JSGPlayerCardModule OnHitOther 没有随机到卡牌:" + this.mOwner.mUnit.PlayerUUID);
  159. return;
  160. }
  161. this.DoPlayerAddCard(cardData, hitter, source, CreateCardBallSource.Normal);
  162. }
  163. //额外增加一个球:指定类型和属性
  164. public override void AddCard(CardType type, int nums)
  165. {
  166. this.DoPlayerAddCard(new GenCardData(type, nums), null, null, CreateCardBallSource.CardLogic);
  167. }
  168. //额外产生一个球:random(true: 使用权重来获取,false: 获得一个权重最高额)
  169. public override void AddCard(int nums, bool useWeight)
  170. {
  171. CardType cardType = mCardRateModule.GetCardByWeight(useWeight);
  172. if (cardType == CardType.Max)
  173. {
  174. log.Warn("JSGPlayerCardModule AddCard 没有随机到卡牌:" + this.mOwner.mUnit.PlayerUUID + ", " + nums);
  175. return;
  176. }
  177. this.DoPlayerAddCard(new GenCardData(cardType, nums), null, null, CreateCardBallSource.CardLogic);
  178. }
  179. //增加某一卡牌权重
  180. public override void ChangeCardWeight(CardType type, CardRateChgType chgType, int value, int validTime,
  181. bool isPrecent = true, int validTimes = -1, int uniqueID = 0)
  182. {
  183. CardRateChgData data = new CardRateChgData();
  184. data.uniqueID = uniqueID;
  185. data.cardType = type;
  186. data.chgType = chgType;
  187. data.isPrecent = isPrecent;
  188. data.value = (short)value;
  189. data.validTime = validTime + CommonLang.CUtils.localTimeMS;
  190. data.validTimes = (short)validTimes;
  191. this.mCardRateModule.AddChanges(data);
  192. }
  193. public override void OnSkillDataChange(GameSkill info)
  194. {
  195. for(int i = 0; i < mPlayerCardSkill.Length; i++)
  196. {
  197. CardSkillData data = mPlayerCardSkill[i];
  198. if(data != null && data.skillId == info.SkillID)
  199. {
  200. data.skilLv = (short)info.SkillLevel;
  201. data.weight = info.TalentSkillLevel1;
  202. break;
  203. }
  204. }
  205. }
  206. public override void OnInitOver(GameSkill info, IJSGCardSkill cardSkill)
  207. {
  208. for (int i = 0; i < mPlayerCardSkill.Length; i++)
  209. {
  210. CardSkillData data = mPlayerCardSkill[i];
  211. if (data != null && data.skillId/100000 == info.SkillID/100000)
  212. {
  213. this.InitSkillData(mPlayerCardSkill[i], info, cardSkill);
  214. if(info.TalentSkillLevel1 > 0 && !this.mIsFuncOpen)
  215. {
  216. this.mIsFuncOpen = true;
  217. }
  218. break;
  219. }
  220. }
  221. }
  222. //玩家增加一个球
  223. private void DoPlayerAddCard(GenCardData cardData, XmdsVirtual hitter, AttackSource source, CreateCardBallSource type)
  224. {
  225. if (!this.mOwner.DispatchTryGetCardBallEvent(this.mOwner, type, cardData.type))
  226. {
  227. return;
  228. }
  229. if (XmdsConfig.Instance.CARD_OPEN_TEST && XmdsConfig.Instance.CARD_GET_LIST.Count > 0)
  230. {
  231. CardType testCardType = XmdsConfig.Instance.CARD_GET_LIST[this.mCardListTestIndex];
  232. log.Warn("出牌调试,使用索引Id: " + this.mCardListTestIndex + ", " + cardData.type + " -> " + testCardType + " 数量:" + cardData.nums);
  233. cardData.type = testCardType;
  234. if ((++this.mCardListTestIndex) >= XmdsConfig.Instance.CARD_GET_LIST.Count) { this.mCardListTestIndex = 0; }
  235. }
  236. #if JSG_CARD_TEST
  237. if (XmdsConfig.Instance.CARD_OPEN_TEST && XmdsConfig.Instance.CARD_GET_LIST.Count > 0)
  238. {
  239. CardType testCardType = XmdsConfig.Instance.CARD_GET_LIST[this.mCardListTestIndex];
  240. log.Warn("出牌调试,使用索引Id: " + this.mCardListTestIndex + ", " + cardData.type + " -> " + testCardType + " 数量:" + cardData.nums);
  241. cardData.type = testCardType;
  242. if ((++this.mCardListTestIndex) >= XmdsConfig.Instance.CARD_GET_LIST.Count) { this.mCardListTestIndex = 0; }
  243. }
  244. else
  245. {
  246. log.Warn("----DoPlayerAddCard: 获得卡牌: " + cardData.type + ", 数量: " + cardData.nums);
  247. }
  248. #endif
  249. CardTriggerResult result = mCardData.AddCard(this.mOwner, cardData);
  250. if (result == null)
  251. {
  252. return;
  253. }
  254. //result.type = CardType.BaiHu;
  255. //result.sameNums = 3;
  256. CardSkillData triggerSkill = mPlayerCardSkill[(int)result.type];
  257. mCardData.SendTriggerInfo(this.mOwner, result, triggerSkill.skillId, result.cardData);
  258. #if JSG_CARD_TEST
  259. log.Warn("----DoPlayerAddCard: 触发卡牌技能: " + result.type + ", 技能ID:" + triggerSkill.skillId + ", 球数:" + result.sameNums);
  260. #endif
  261. //改成延时触发
  262. //triggerSkill.skill.TriggerCardSkill(this.mOwner, hitter, source, triggerSkill, result.sameNums);
  263. //this.mOwner.DispatchTriggerCardSkillEvent(this.mOwner, hitter, result.type, result.sameNums);
  264. base.mTriggerSkillDelay.init(triggerSkill.skill, this.mOwner, hitter, source, triggerSkill, result.sameNums);
  265. //技能释放完成,记录上一次释放的卡牌信息
  266. this.mLastCardInfo.cardType = result.type;
  267. this.mLastCardInfo.time = CommonLang.CUtils.localTimeMS;
  268. }
  269. //重置当前强化效果
  270. public override void TriggerSkillLoadStrength(CardSkillData skillData, int sameNums)
  271. {
  272. this.mNextCardStrengthInfo.TriggerSkillLoadStrength(skillData, sameNums);
  273. }
  274. // 获得特殊效果强化加成
  275. public override IntIntData GetStrengthInfo(CardStrengthenType type)
  276. {
  277. return this.mNextCardStrengthInfo.GetStrengthInfo(type);
  278. }
  279. // 添加下一次强化效果
  280. public override NextCardStrengthenInfo AddNextStrengthInfo(CardType type, CardStrengthenType strenghType, int value1, int value2, int validTime, int validTimes = -1,
  281. byte needSames = 0, DamageType dmgType = DamageType.None, CardLayerRule layerRules = null)
  282. {
  283. return this.mNextCardStrengthInfo.AddStrength(type, strenghType, value1, value2, validTime, validTimes, needSames, dmgType, layerRules);
  284. }
  285. //上一次释放技能信息
  286. public override GetCardData GetLastCardData()
  287. {
  288. return this.mLastCardInfo;
  289. }
  290. }
  291. }