Browse Source

【需求】:MMO-21033奶妈叠毒机制增加限制

meijun 3 years ago
parent
commit
0df008453b

+ 12 - 5
XmdsVSPlugins/XmdsCommonSkill/Plugin/PassiveSkills/Remedy/Remedy_510601.cs

@@ -36,6 +36,8 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy
 
 		//毒伤buff时间,基础效果固伤_百分比系数,每层毒提供效果固伤_百分比系数
 		private static XmdsSkillValue mValueSet1;
+		//非boss单位,N毫秒内叠毒上限M
+		private static XmdsSkillValue mValueSet2;
 
 		//私有数据
 		private PlayerCache_Remedy mPlayerCache;
@@ -44,8 +46,9 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy
 		protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner)
 		{
 			int skillLv = skillInfo.GetPassiveLevel();
-			mPlayerCache = XmdsPlayerCache.PlayerTalnetInit(XmdsUnitPro.Priest, owner.mUnit, mValueSet1.GetValue(skillLv, 1), null) as PlayerCache_Remedy;
-			owner.SetPlayerCache(mPlayerCache);			
+			IntIntIntData poisonRule = new IntIntIntData(mValueSet2.GetValue(skillLv, 1), mValueSet2.GetValue(skillLv, 2), 0);
+			mPlayerCache = XmdsPlayerCache.PlayerTalnetInit(XmdsUnitPro.Priest, owner.mUnit, 0, poisonRule) as PlayerCache_Remedy;
+			owner.SetPlayerCache(mPlayerCache);
 
 			// Buff1修改
 			var pack1 = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(Buff_POISON);
@@ -100,9 +103,12 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy
 			}
 
 			//挂毒buff
-			if(poisonRate.value1 > 0 && poisonRate.value2 > 0 && attacker.mUnit.RandomN.Next(GlobalData.RATE_BASE) < (poisonRate.value1 + mPlayerCache.GetRateAddition()))
+			if (poisonRate.value1 > 0 && poisonRate.value2 > 0 && attacker.mUnit.RandomN.Next(GlobalData.RATE_BASE) < (poisonRate.value1 + mPlayerCache.GetRateAddition()))
 			{
-				hitted.mUnit.AddBuff(Buff_POISON, attacker.mUnit, 0, false, false, false, 0, poisonRate.value2);
+                if (mPlayerCache.IsCanAddPosion(hitted))
+                {
+					hitted.mUnit.AddBuff(Buff_POISON, attacker.mUnit, 0, false, false, false, 0, poisonRate.value2);
+				}				
 				//mPlayerCache.RecordPoisonPlayer(hitted);
 			}
 
@@ -122,7 +128,7 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy
 			buff.mDeeperDmg = mValueSet1.GetValue(skillLv, 4);
 			buff.mDeeperDmgPer = mValueSet1.GetValue(skillLv, 5);
 
-			mPlayerCache.RefreshConfig(mValueSet1.GetValue(skillLv, 1));
+			mPlayerCache.RefreshConfig(mValueSet1.GetValue(skillLv, 1), mValueSet1.GetValue(skillLv, 2));
 		}
 
 		protected override void OnDispose(XmdsVirtual owner)
@@ -135,6 +141,7 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy
 		{
 			XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID);
 			InitData(data, out mValueSet1, XmdsSkillData.XmdsSkillDataKey.ValueSet);
+			InitData(data, out mValueSet2, XmdsSkillData.XmdsSkillDataKey.ValueSet2);
 		}
 	}
 

+ 10 - 2
XmdsVSPlugins/XmdsCommonSkill/Plugin/Skills/Remedy/Remedy_510420.cs

@@ -36,8 +36,16 @@ namespace XmdsCommonSkill.Plugin.Skills.Remedy
 				param.UseDamageType = CommonAI.Data.DamageType.None;
 				if(JSGModule.RandomPrecent(valueSet3.GetValue(param.GameSkill.TalentSkillLevel2, 1)))
 				{
-					int addLayer = valueSet3.GetValue(param.GameSkill.TalentSkillLevel2, 2);
-					param.Hitter.mUnit.AddBuff(Remedy_510601.Buff_POISON, param.Attacker.mUnit, 0, false, false, false, 0, addLayer);
+					PlayerCache_Remedy talnet = param.Attacker.GetPlayerCache() as PlayerCache_Remedy;
+					if (talnet == null)
+					{
+						log.Warn("Remedy_510420叠毒找不到天赋:" + param.Attacker.mUnit.PlayerUUID + ", " + param.Attacker.mUnit.Parent.GetSceneID());
+					}
+					else if(talnet.IsCanAddPosion(param.Hitter))
+                    {
+						int addLayer = valueSet3.GetValue(param.GameSkill.TalentSkillLevel2, 2);
+						param.Hitter.mUnit.AddBuff(Remedy_510601.Buff_POISON, param.Attacker.mUnit, 0, false, false, false, 0, addLayer);
+					}					
 				}
 			}				
 		}

+ 10 - 1
XmdsVSPlugins/XmdsCommonSkill/Plugin/Skills/Remedy/Remedy_510460.cs

@@ -79,8 +79,17 @@ namespace XmdsCommonSkill.Plugin.Skills.Remedy
 				mHitUnitExt.Put(param.Hitter.mUnit.ID, 1);
 				//2段禁锢
 				param.Hitter.mUnit.AddBuff(Buff_JINGUEXT, param.Attacker.mUnit);
+
 				//额外附加N层毒
-				param.Hitter.mUnit.AddBuff(Remedy_510601.Buff_POISON, param.Attacker.mUnit, 0, false, false, false, 0, valueSet4.GetValue(param.GameSkill.TalentSkillLevel3, 2));
+				PlayerCache_Remedy talnet = param.Attacker.GetPlayerCache() as PlayerCache_Remedy;
+				if (talnet == null)
+				{
+					log.Warn("Remedy_510460叠毒找不到天赋:" + param.Attacker.mUnit.PlayerUUID + ", " + param.Attacker.mUnit.Parent.GetSceneID());
+				}
+				else if (talnet.IsCanAddPosion(param.Hitter))
+				{
+					param.Hitter.mUnit.AddBuff(Remedy_510601.Buff_POISON, param.Attacker.mUnit, 0, false, false, false, 0, valueSet4.GetValue(param.GameSkill.TalentSkillLevel3, 2));
+				}				
 				return false;
 			}
 			else

+ 1 - 1
XmdsVSPlugins/XmdsCommonSkill/Plugin/base/PlayerCache/PlayerCacheBase.cs

@@ -31,7 +31,7 @@ namespace XmdsCommonSkill.Plugin.Skills
 			//this.ReInit(unit);
 		}
 
-		public virtual void ReInit(InstanceUnit unit)
+		public virtual void ReInit(InstanceUnit unit, int maxValue, IntIntIntData refreshRule = null, IntIntData[] talnetData = null)
 		{
 			this.MarkValid(true);
 			this.mOwner = unit;

+ 82 - 49
XmdsVSPlugins/XmdsCommonSkill/Plugin/base/PlayerCache/PlayerCache_Remedy.cs

@@ -31,8 +31,12 @@ namespace XmdsCommonSkill.Plugin.Skills
 		//记录所有附加毒的玩家信息
 		//private HashMap<String, PoisonPlayers> mPoisonPlayers = new HashMap<String, PoisonPlayers>();
 
-		//毒buff有效时间
-		private int mPoisonValidTime;
+		/* 设置叠毒限制 - 非boss单位,N毫秒内叠毒上限M */
+		private int mPoisonValidTime;		// 毒计算时间维度
+		private int mPosionTotals;          // 单位时间维度内叠毒上限
+		//private short mRecordPosions;
+		private long mRecordPosionEndTime;  // 单位时间内,累计叠毒截止时间,
+		private HashSet<uint> mRecordPosionExt = new HashSet<uint>();
 
 		//强化4-5内容
 		public int mPoisonBreakDmgAdd;				//毒爆伤害增加
@@ -42,9 +46,10 @@ namespace XmdsCommonSkill.Plugin.Skills
 		private long mPoisonRateVaildTime;
 		private int mPoisonAddRate;
 
-		public PlayerCache_Remedy(InstanceUnit unit, int poisonTime) : base(unit, null)
+		public PlayerCache_Remedy(InstanceUnit unit, int recordTime, int poisionTotal) : base(unit, null)
 		{
-			this.mPoisonValidTime = Math.Max(1000, poisonTime);
+            this.mPoisonValidTime = recordTime;
+            this.mPosionTotals = poisionTotal;
 		}
 
 		//刷新概率信息
@@ -92,13 +97,40 @@ namespace XmdsCommonSkill.Plugin.Skills
 			//{
 			//	mPoisonRate.Clear();
 			//}
-			this.mPoisonValidTime = 0;
 			this.mPoisonBreakDmgAdd = 0;
 			this.mPoisonBreakFullDmgAdd = 0;
 			this.mPoisonRateVaildTime = 0;
 			this.mPoisonAddRate = 0;
 		}
 
+		/* 是否可以叠毒 */
+		public bool IsCanAddPosion(XmdsVirtual hitted)
+        {
+			if (!hitted.IsBoss())
+			{
+				if (this.mRecordPosionEndTime > CommonLang.CUtils.localTimeMS)
+				{
+					//this.mRecordPosions++;
+					if (mRecordPosionExt.Count >= mPosionTotals)
+					{
+						return false;
+					}
+                    else
+                    {
+						mRecordPosionExt.Add(hitted.mUnit.ID);
+					}
+				}
+				else
+				{
+					this.mRecordPosionEndTime = CommonLang.CUtils.localTimeMS + mPoisonValidTime;
+					mRecordPosionExt.Clear();
+					//this.mRecordPosions = 1;
+					mRecordPosionExt.Add(hitted.mUnit.ID);
+				}
+			}
+
+			return true;
+        }
 
 		//记录叠毒玩家信息
 		//public void RecordPoisonPlayer(XmdsVirtual hitter)
@@ -115,52 +147,53 @@ namespace XmdsCommonSkill.Plugin.Skills
 		//}
 
 		//刷新配置
-		public void RefreshConfig(int poisonTime)
+		public void RefreshConfig(int recordTime, int poisionTotal)
 		{
-			this.mPoisonValidTime = Math.Max(1000, poisonTime);
+			this.mPoisonValidTime = recordTime;
+			this.mPosionTotals = poisionTotal;
 		}
 
-		//毒爆: checkRange内的玩家毒会爆炸
-		//public void TriggerPoisonEffect(int damageBase, int damagePer, int checkRange = 9, int addLayer = 0, int breakAddBuffId = 0, int breakAddBufMaxLayer = 0)
-		//{
-		//	XmdsVirtual owner = this.mOwner.Virtual as XmdsVirtual;
-		//	foreach (PoisonPlayers playerData in mPoisonPlayers.Values)
-		//	{
-		//		if (playerData.buffValidTime < CommonLang.CUtils.localTimeMS || !playerData.player.mUnit.IsActive)
-		//		{
-		//			continue;
-		//		}
-		//		else if(CMath.getDistance(mOwner.X, mOwner.Y, playerData.player.mUnit.X, playerData.player.mUnit.Y) > checkRange)
-		//		{
-		//			continue;
-		//		}
-
-		//		BuffState buffState = playerData.player.mUnit.GetBuffByIDAndSender(Remedy_510601.Buff_POISON, this.mOwner.ID);
-		//		if(buffState == null)
-		//		{
-		//			continue;
-		//		}
-
-		//		int finalLayer = 1 + buffState.OverlayLevel + addLayer;
-		//		damagePer += (this.mPoisonBreakDmgAdd + (finalLayer >= buffState.Data.MaxOverlay ? this.mPoisonBreakFullDmgAdd : 0));
-
-		//		int attackTemp = (int)(owner.MirrorProp.GetFinalAttack(playerData.player.mUnit.IsMonster) / XmdsDamageCalculator.PERER * damagePer);
-		//		int calcDmg = (damageBase + XmdsDamageCalculator.GetDamage(attackTemp, owner, playerData.player, null)) * finalLayer;
-		//		playerData.player.mUnit.AddHP(-calcDmg, this.mOwner);
-		//		playerData.player.mUnit.removeBuffBySender(Remedy_510601.Buff_POISON, this.mOwner.ID);
-
-		//		// 附加额外buff
-		//		if(breakAddBuffId > 0)
-		//		{					
-		//			BuffState buff = playerData.player.mUnit.AddBuff(breakAddBuffId, this.mOwner, 0, false, false, false, 0, finalLayer);
-		//			buff.SetLayerLevel((byte)(Math.Min(breakAddBufMaxLayer, finalLayer)));
-		//		}				
-
-		//		System.Console.WriteLine("毒爆: " + playerData.player.mUnit.Info.Name + ", 伤害:" + calcDmg + ", 结算层:" + (1 + buffState.OverlayLevel + addLayer));
-		//	}
-
-		//	this.mPoisonPlayers.Clear();
-		//}
+	//毒爆: checkRange内的玩家毒会爆炸
+	//public void TriggerPoisonEffect(int damageBase, int damagePer, int checkRange = 9, int addLayer = 0, int breakAddBuffId = 0, int breakAddBufMaxLayer = 0)
+	//{
+	//	XmdsVirtual owner = this.mOwner.Virtual as XmdsVirtual;
+	//	foreach (PoisonPlayers playerData in mPoisonPlayers.Values)
+	//	{
+	//		if (playerData.buffValidTime < CommonLang.CUtils.localTimeMS || !playerData.player.mUnit.IsActive)
+	//		{
+	//			continue;
+	//		}
+	//		else if(CMath.getDistance(mOwner.X, mOwner.Y, playerData.player.mUnit.X, playerData.player.mUnit.Y) > checkRange)
+	//		{
+	//			continue;
+	//		}
+
+	//		BuffState buffState = playerData.player.mUnit.GetBuffByIDAndSender(Remedy_510601.Buff_POISON, this.mOwner.ID);
+	//		if(buffState == null)
+	//		{
+	//			continue;
+	//		}
+
+	//		int finalLayer = 1 + buffState.OverlayLevel + addLayer;
+	//		damagePer += (this.mPoisonBreakDmgAdd + (finalLayer >= buffState.Data.MaxOverlay ? this.mPoisonBreakFullDmgAdd : 0));
+
+	//		int attackTemp = (int)(owner.MirrorProp.GetFinalAttack(playerData.player.mUnit.IsMonster) / XmdsDamageCalculator.PERER * damagePer);
+	//		int calcDmg = (damageBase + XmdsDamageCalculator.GetDamage(attackTemp, owner, playerData.player, null)) * finalLayer;
+	//		playerData.player.mUnit.AddHP(-calcDmg, this.mOwner);
+	//		playerData.player.mUnit.removeBuffBySender(Remedy_510601.Buff_POISON, this.mOwner.ID);
+
+	//		// 附加额外buff
+	//		if(breakAddBuffId > 0)
+	//		{					
+	//			BuffState buff = playerData.player.mUnit.AddBuff(breakAddBuffId, this.mOwner, 0, false, false, false, 0, finalLayer);
+	//			buff.SetLayerLevel((byte)(Math.Min(breakAddBufMaxLayer, finalLayer)));
+	//		}				
+
+	//		System.Console.WriteLine("毒爆: " + playerData.player.mUnit.Info.Name + ", 伤害:" + calcDmg + ", 结算层:" + (1 + buffState.OverlayLevel + addLayer));
+	//	}
+
+	//	this.mPoisonPlayers.Clear();
+	//}
 
-	}
+}
 }

+ 3 - 3
XmdsVSPlugins/XmdsCommonSkill/Plugin/base/PlayerCache/XmdsPlayerCache.cs

@@ -28,7 +28,7 @@ namespace XmdsCommonSkill.Plugin.Skills
 					mGlobalMonsterCache.Put(uniqueID, oldData);
 				}
 
-				oldData.ReInit(unit);
+				oldData.ReInit(unit, maxValue, refreshRule, talnetData);
 				return oldData;
 			}
 			else
@@ -40,7 +40,7 @@ namespace XmdsCommonSkill.Plugin.Skills
 					mGlobalPlayerCache.Put(unit.PlayerUUID, oldData);
 				}
 
-				oldData.ReInit(unit);
+				oldData.ReInit(unit, maxValue, refreshRule, talnetData);
 				return oldData;
 			}
 		}
@@ -54,7 +54,7 @@ namespace XmdsCommonSkill.Plugin.Skills
 				case XmdsUnitPro.Sword:
 					return new PlayerCache_Warrior(unit, maxValue, refreshRule);
 				case XmdsUnitPro.Priest:
-					return new PlayerCache_Remedy(unit, maxValue);
+					return new PlayerCache_Remedy(unit, refreshRule.value1, refreshRule.value2);
 			}
 
 			return null;