فهرست منبع

fix(pet): Pet actions will use the npc template to figure out what skill to use

This fixes Buff Control for improved baby pets and should make all other pet actions work as defined in the npc template.
Noe Caratini 2 سال پیش
والد
کامیت
ea0bf93e8d

+ 20 - 36
src/main/java/com/l2jserver/gameserver/model/L2PetData.java

@@ -22,8 +22,11 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.IntStream;
 
-import com.l2jserver.gameserver.datatables.SkillData;
+import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 
 /**
@@ -137,41 +140,22 @@ public class L2PetData {
 		_skills.add(new L2PetSkillLearn(skillId, skillLvl, petLvl));
 	}
 	
-	/**
-	 * TODO: Simplify this.
-	 * @param skillId the skill Id.
-	 * @param petLvl the pet level.
-	 * @return the level of the skill for the given skill Id and pet level.
-	 */
-	public int getAvailableLevel(int skillId, int petLvl) {
-		int lvl = 0;
-		for (L2PetSkillLearn temp : _skills) {
-			if (temp.getSkillId() != skillId) {
-				continue;
-			}
-			if (temp.getSkillLvl() == 0) {
-				if (petLvl < 70) {
-					lvl = (petLvl / 10);
-					if (lvl <= 0) {
-						lvl = 1;
-					}
-				} else {
-					lvl = (7 + ((petLvl - 70) / 5));
-				}
-				
-				// formula usable for skill that have 10 or more skill levels
-				int maxLvl = SkillData.getInstance().getMaxLevel(temp.getSkillId());
-				if (lvl > maxLvl) {
-					lvl = maxLvl;
-				}
-				break;
-			} else if (temp.getMinLevel() <= petLvl) {
-				if (temp.getSkillLvl() > lvl) {
-					lvl = temp.getSkillLvl();
-				}
-			}
-		}
-		return lvl;
+	public int getAvailableLevel(final L2Summon pet, int skillId) {
+		final StatsSet parameters = pet.getTemplate().getParameters();
+		final int currentStep = (int) Math.floor((pet.getLevel() / 5.) - 11);
+		
+		return IntStream.rangeClosed(0, currentStep)
+				.map(i -> currentStep - i)
+				.mapToObj(step -> IntStream.iterate(1, i -> i + 1)
+						.mapToObj(skillNum -> parameters.getObject("step" + step + "_skill0" + skillNum, SkillHolder.class))
+						.takeWhile(Objects::nonNull)
+						.filter(skill -> skill.getSkillId() == skillId)
+						.findFirst())
+				.filter(Optional::isPresent)
+				.map(Optional::get)
+				.mapToInt(SkillHolder::getSkillLvl)
+				.findFirst()
+				.orElse(0);
 	}
 	
 	/**

+ 1 - 1
src/main/java/com/l2jserver/gameserver/network/clientpackets/RequestActionUse.java

@@ -759,7 +759,7 @@ public final class RequestActionUse extends L2GameClientPacket {
 		
 		int lvl;
 		if (summon.isPet()) {
-			lvl = PetDataTable.getInstance().getPetData(summon.getId()).getAvailableLevel(skillId, summon.getLevel());
+			lvl = PetDataTable.getInstance().getPetData(summon.getId()).getAvailableLevel(summon, skillId);
 		} else {
 			lvl = SummonSkillsTable.getInstance().getAvailableLevel(summon, skillId);
 		}