浏览代码

More retail like improved pets.
1. Buff Control now using skill 5771 (green icon), not toggle, cant be removed.
2. Pet recharge only if owner in the combat mode, until 70% of owner's mana.
3. Pet buff after current buff removed, not on 50% of elapsed time.
4. Heal and recharge not affected by Buff Control.

DP update required for normal functioning.

_DS_ 15 年之前
父节点
当前提交
18034c6cfb

+ 0 - 20
L2_GameServer/java/net/sf/l2j/gameserver/model/L2Effect.java

@@ -656,24 +656,4 @@ public abstract class L2Effect
 	{
 		return _effectSkillType;
 	}
-	
-	/**
-	 * Returns the elapsed time of the task.
-	 *
-	 * @return Time in seconds.
-	 */
-	public int getElapsedTaskTime()
-	{
-		return (getTotalCount() - _count) * _period + getTime() + 1;
-	}
-
-	public int getTotalTaskTime()
-	{
-		return getTotalCount() * _period;
-	}
-	
-	public int getRemainingTaskTime()
-	{
-		return getTotalTaskTime() - getElapsedTaskTime();
-	}
 }

+ 65 - 69
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2BabyPetInstance.java

@@ -40,6 +40,8 @@ import net.sf.l2j.util.Rnd;
  */
 public final class L2BabyPetInstance extends L2PetInstance
 {
+	protected static final int BUFF_CONTROL = 5771;
+
 	protected FastList<Integer> _buffs = null;
 	protected int _majorHeal = 0;
 	protected int _minorHeal = 0;
@@ -67,6 +69,9 @@ public final class L2BabyPetInstance extends L2PetInstance
 			skill = SkillTable.getInstance().getInfo(id, PetSkillsTable.getInstance().getAvailableLevel(L2BabyPetInstance.this, id));
 			if (skill != null)
 			{
+				if (skill.getId() == BUFF_CONTROL)
+					continue;
+
 				switch (skill.getSkillType())
 				{
 					case HEAL:
@@ -135,17 +140,6 @@ public final class L2BabyPetInstance extends L2PetInstance
 			_buffs.clear();
 	}
 
-	public final void toggleBuffControl()
-	{
-		final long currentTime = System.currentTimeMillis();
-		if (currentTime > _buffControlTimestamp)
-			// disable buffs for 5 min
-			_buffControlTimestamp = currentTime + 300000L;
-		else
-			// enable buffs
-			_buffControlTimestamp = 0;
-	}
-
 	private final void startCastTask()
 	{
 		if (_majorHeal > 0 || _buffs != null || _recharge > 0)
@@ -211,8 +205,7 @@ public final class L2BabyPetInstance extends L2PetInstance
 					&& !_baby.isCastingNow()
 					&& !_baby.isBetrayed()
 					&& !_baby.isMuted()
-					&& _baby.getAI().getIntention() != CtrlIntention.AI_INTENTION_CAST
-					&& _buffControlTimestamp < System.currentTimeMillis())
+					&& _baby.getAI().getIntention() != CtrlIntention.AI_INTENTION_CAST)
 			{
 				L2Skill skill = null;
 
@@ -238,77 +231,80 @@ public final class L2BabyPetInstance extends L2PetInstance
 					}
 				}
 
-				// searching for usable buffs
-				if (_buffs != null && !_buffs.isEmpty())
+				if (!_baby.isSkillDisabled(BUFF_CONTROL)) // Buff Control is not active
 				{
-					for (int id : _buffs)
+					// searching for usable buffs
+					if (_buffs != null && !_buffs.isEmpty())
 					{
-						if (_baby.isSkillDisabled(id))
-							continue;
-						skill = SkillTable.getInstance().getInfo(id, PetSkillsTable.getInstance().getAvailableLevel(_baby, id));
-						if (skill != null && _baby.getCurrentMp() >= skill.getMpConsume())
-							_currentBuffs.add(skill);
+						for (int id : _buffs)
+						{
+							if (_baby.isSkillDisabled(id))
+								continue;
+							skill = SkillTable.getInstance().getInfo(id, PetSkillsTable.getInstance().getAvailableLevel(_baby, id));
+							if (skill != null && _baby.getCurrentMp() >= skill.getMpConsume())
+								_currentBuffs.add(skill);
+						}
 					}
-				}
 
-				// buffs found, checking owner buffs
-				if (!_currentBuffs.isEmpty())
-				{
-					L2Effect[] effects = owner.getAllEffects();
-					Iterator<L2Skill> iter;
-					L2Skill currentSkill;
-					for (L2Effect e : effects)
+					// buffs found, checking owner buffs
+					if (!_currentBuffs.isEmpty())
 					{
-						if (e == null)
-							continue;
-
-						currentSkill = e.getSkill();
-						// skipping debuffs, passives, toggles
-						if (currentSkill.isDebuff()
-								|| currentSkill.isPassive()
-								|| currentSkill.isToggle())
-							continue;
-
-						// if buff does not need to be casted - remove it from list
-						iter = _currentBuffs.iterator();
-						while (iter.hasNext())
+						L2Effect[] effects = owner.getAllEffects();
+						Iterator<L2Skill> iter;
+						L2Skill currentSkill;
+						for (L2Effect e : effects)
 						{
-							skill = iter.next();
-							if (currentSkill.getId() == skill.getId()
-									&& currentSkill.getLevel() >= skill.getLevel())
+							if (e == null)
+								continue;
+
+							currentSkill = e.getSkill();
+							// skipping debuffs, passives, toggles
+							if (currentSkill.isDebuff()
+									|| currentSkill.isPassive()
+									|| currentSkill.isToggle())
+								continue;
+
+							// if buff does not need to be casted - remove it from list
+							iter = _currentBuffs.iterator();
+							while (iter.hasNext())
 							{
-								// same skill with equal or greater level
-								// replace only if remaining time lower than 60s
-								if (e.getRemainingTaskTime() > 60)
-									iter.remove();
-							}
-							else
-							{
-								// effect with same stacktype and greater or equal stackorder
-								if (skill.hasEffects()
-										&& !"none".equals(skill.getEffectTemplates()[0].stackType)
-										&& e.getStackType().equals(skill.getEffectTemplates()[0].stackType)
-										&& e.getStackOrder() >= skill.getEffectTemplates()[0].stackOrder)
+								skill = iter.next();
+								if (currentSkill.getId() == skill.getId()
+										&& currentSkill.getLevel() >= skill.getLevel())
+								{
 									iter.remove();
+								}
+								else
+								{
+									// effect with same stacktype and greater or equal stackorder
+									if (skill.hasEffects()
+											&& !"none".equals(skill.getEffectTemplates()[0].stackType)
+											&& e.getStackType().equals(skill.getEffectTemplates()[0].stackType)
+											&& e.getStackOrder() >= skill.getEffectTemplates()[0].stackOrder)
+									{
+										iter.remove();
+									}
+								}
 							}
+							// no more buffs in list
+							if (_currentBuffs.isEmpty())
+								break;
+						}
+						// buffs list ready, casting random
+						if (!_currentBuffs.isEmpty())
+						{
+							castSkill(_currentBuffs.get(Rnd.get(_currentBuffs.size())));
+							_currentBuffs.clear();
+							return;
 						}
-						// no more buffs in list
-						if (_currentBuffs.isEmpty())
-							break;
-					}
-					// buffs list ready, casting random
-					if (!_currentBuffs.isEmpty())
-					{
-						castSkill(_currentBuffs.get(Rnd.get(_currentBuffs.size())));
-						_currentBuffs.clear();
-						return;
 					}
 				}
 
-				// buffs not casted, trying recharge, if exist
+				// buffs/heal not casted, trying recharge, if exist
 				if (_recharge > 0
 						&& !_baby.isSkillDisabled(_recharge)
-						&& owner.getCurrentMp()/owner.getMaxMp() < 0.5
+						&& owner.getCurrentMp()/owner.getMaxMp() < 0.7
+						&& owner.isInCombat() // recharge casted only if owner in combat stance
 						&& Rnd.get(100) <= 60)
 				{
 					skill = SkillTable.getInstance().getInfo(_recharge, PetSkillsTable.getInstance().getAvailableLevel(_baby, _recharge));

+ 1 - 4
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestActionUse.java

@@ -28,7 +28,6 @@ import net.sf.l2j.gameserver.model.L2ManufactureList;
 import net.sf.l2j.gameserver.model.L2Object;
 import net.sf.l2j.gameserver.model.L2Skill;
 import net.sf.l2j.gameserver.model.actor.L2Summon;
-import net.sf.l2j.gameserver.model.actor.instance.L2BabyPetInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
@@ -536,9 +535,7 @@ public final class RequestActionUse extends L2GameClientPacket
 				useSkill(5752); // Flare
 				break;
 			case 1070:
-				// Buff control
-				if (pet != null && pet instanceof L2BabyPetInstance)
-					((L2BabyPetInstance)pet).toggleBuffControl();
+				useSkill(5771);	// Buff control
 				break;
 			case 1071:
 				useSkill(5761); // Power Strike