Explorar o código

Player skill levels depend on his level - if player level is lower than skill last learn level - 9, skill level is decreased to next possible (or removed).

JIV %!s(int64=15) %!d(string=hai) anos
pai
achega
9734d6bdef

+ 2 - 0
L2_GameServer/java/com/l2jserver/Config.java

@@ -78,6 +78,7 @@ public final class Config
 	public static int MASTERACCESS_NAME_COLOR;
 	public static int MASTERACCESS_TITLE_COLOR;
 	public static boolean ALT_GAME_DELEVEL;
+	public static boolean DECREASE_SKILL_LEVEL;
 	public static double ALT_WEIGHT_LIMIT;
 	public static int RUN_SPD_BOOST;
 	public static int DEATH_PENALTY_CHANCE;
@@ -1309,6 +1310,7 @@ public final class Config
 					MASTERACCESS_NAME_COLOR = Integer.decode(StringUtil.concat("0x", Character.getProperty("MasterNameColor", "00FF00")));
 					MASTERACCESS_TITLE_COLOR = Integer.decode(StringUtil.concat("0x", Character.getProperty("MasterTitleColor", "00FF00")));
 					ALT_GAME_DELEVEL = Boolean.parseBoolean(Character.getProperty("Delevel", "true"));
+					DECREASE_SKILL_LEVEL = Boolean.parseBoolean(Character.getProperty("DecreaseSkillOnDelevel", "true"));
 					ALT_WEIGHT_LIMIT = Double.parseDouble(Character.getProperty("AltWeightLimit", "1"));
 					RUN_SPD_BOOST = Integer.parseInt(Character.getProperty("RunSpeedBoost", "0"));
 					DEATH_PENALTY_CHANCE = Integer.parseInt(Character.getProperty("DeathPenaltyChance", "20"));

+ 12 - 0
L2_GameServer/java/com/l2jserver/gameserver/datatables/SkillTreeTable.java

@@ -710,6 +710,18 @@ public class SkillTreeTable
 		return skillCost;
 	}
 	
+	public L2SkillLearn getSkillLearnBySkillIdLevel(ClassId classId, int skillId, int skillLvl)
+	{
+		for (L2SkillLearn sl : getAllowedSkills(classId))
+		{
+			if (sl.getId() == skillId && sl.getLevel() == skillLvl)
+			{
+				return sl; // found skill learn
+			}
+		}
+		return null;
+	}
+	
 	@SuppressWarnings("synthetic-access")
 	private static class SingletonHolder
 	{

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -187,7 +187,7 @@ public abstract class L2Character extends L2Object
 	private Calculator[] _calculators;
 
 	/** FastMap(Integer, L2Skill) containing all skills of the L2Character */
-	private final Map<Integer, L2Skill> _skills;
+	protected final Map<Integer, L2Skill> _skills;
 	/** FastMap containing the active chance skills on this character */
 	private ChanceSkillList _chanceSkills;
 

+ 51 - 0
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -10965,6 +10965,8 @@ public final class L2PcInstance extends L2Playable
 		revalidateZone(true);
 		
 		notifyFriends();
+		if (!isGM() && Config.DECREASE_SKILL_LEVEL)
+			checkPlayerSkills();
 	}
 
 	public long getLastAccess()
@@ -14810,4 +14812,53 @@ public final class L2PcInstance extends L2Playable
 	{
 		_offlineShopStart = time;
 	}
+	
+	/**
+	 * Check all player skills for skill level. If player level is lower than skill learn level - 9, skill level is decreased to next possible level.
+	 */
+	public void checkPlayerSkills()
+	{
+		for (int id : _skills.keySet())
+		{
+			int level = getSkillLevel(id);
+			if (level >= 100) // enchanted skill
+				level = SkillTable.getInstance().getMaxLevel(id);
+			L2SkillLearn learn = SkillTreeTable.getInstance().getSkillLearnBySkillIdLevel(getClassId(), id, level);
+			// not found - not a learn skill?
+			if (learn == null)
+			{
+				continue;
+			}
+			else
+			{
+				// player level is too low for such skill level
+				if (getLevel() < (learn.getMinLevel() - 9))
+					deacreaseSkillLevel(id);
+			}
+		}
+	}
+	
+	private void deacreaseSkillLevel(int id)
+	{
+		int nextLevel = -1;
+		for (L2SkillLearn sl : SkillTreeTable.getInstance().getAllowedSkills(getClassId()))
+		{
+			if (sl.getId() == id && nextLevel < sl.getLevel() && getLevel() >= (sl.getMinLevel() - 9))
+			{
+				// next possible skill level
+				nextLevel = sl.getLevel();
+			}
+		}
+		
+		if (nextLevel == -1) // there is no lower skill
+		{
+			_log.info("Removing skill id "+id+ " level "+getSkillLevel(id)+" from player "+this);
+			removeSkill(_skills.get(id), true);
+		}
+		else // replace with lower one
+		{
+			_log.info("Decreasing skill id "+id+" from "+getSkillLevel(id)+" to "+nextLevel+" for "+this);
+			addSkill(SkillTable.getInstance().getInfo(id, nextLevel), true);
+		}
+	}
 }

+ 7 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/stat/PlayableStat.java

@@ -16,6 +16,7 @@ package com.l2jserver.gameserver.model.actor.stat;
 
 import java.util.logging.Logger;
 
+import com.l2jserver.Config;
 import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Playable;
@@ -132,7 +133,12 @@ public class PlayableStat extends CharStat
 
         // Sync up exp with current level
         if (getExp() >= getExpForLevel(getLevel() + 1) || getExpForLevel(getLevel()) > getExp()) setExp(getExpForLevel(getLevel()));
-
+        
+        if (!levelIncreased && getActiveChar() instanceof L2PcInstance && !((L2PcInstance)(getActiveChar())).isGM() && Config.DECREASE_SKILL_LEVEL) 
+        {
+        	((L2PcInstance)(getActiveChar())).checkPlayerSkills();
+        }
+        
         if (!levelIncreased) return false;
 
         getActiveChar().getStatus().setCurrentHp(getActiveChar().getStat().getMaxHp());

+ 5 - 1
L2_GameServer/java/config/Character.properties

@@ -21,7 +21,6 @@ MasterNameColor = 00CCFF
 # Default: 00CCFF
 MasterTitleColor = 00CCFF
 
-
 # ---------------------------------------------------------------------------
 # Statistics
 # ---------------------------------------------------------------------------
@@ -29,6 +28,11 @@ MasterTitleColor = 00CCFF
 # Default: True
 Delevel = True
 
+# This option enable check for all player skills for skill level. 
+# If player level is lower than skill learn level - 9, skill level is decreased to next possible level.
+# If there is no possible level, skill is removed from player.
+DecreaseSkillOnDelevel = True
+
 # Weight limit multiplier. Example: Setting this to 5 will give players 5x the normal weight limit.
 # Default: 1
 AltWeightLimit = 1