JSGPlayerCardModule.cs 11 KB

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