Pārlūkot izejas kodu

BETA: Fixing effect restoring missing:
* Now works for players, pets and servitors.
* Adding logs to TradeList, since thrown NPE doesn't provide enough information to address the issues.

Reported by: oscard, St3eT

Zoey76 12 gadi atpakaļ
vecāks
revīzija
4928cbaa27

+ 6 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/TradeList.java

@@ -191,7 +191,7 @@ public class TradeList
 	 * @param count : int
 	 * @return
 	 */
-	public synchronized TradeItem addItem(int objectId, long count)
+	public TradeItem addItem(int objectId, long count)
 	{
 		return addItem(objectId, count, 0);
 	}
@@ -214,24 +214,26 @@ public class TradeList
 		L2Object o = L2World.getInstance().findObject(objectId);
 		if (!(o instanceof L2ItemInstance))
 		{
-			_log.warning(_owner.getName() + ": Attempt to add invalid item to TradeList!");
+			_log.warning(_owner.getName() + ": Trying to add something other than an item!");
 			return null;
 		}
 		
 		L2ItemInstance item = (L2ItemInstance) o;
-		
 		if (!(item.isTradeable() || (getOwner().isGM() && Config.GM_TRADE_RESTRICTED_ITEMS)) || item.isQuestItem())
 		{
+			_log.warning(_owner.getName() + ": Attempt to add a restricted item!");
 			return null;
 		}
 		
 		if (!getOwner().getInventory().canManipulateWithItemId(item.getItemId()))
 		{
+			_log.warning(_owner.getName() + ": Attempt to add an item that can't manipualte!");
 			return null;
 		}
 		
 		if ((count <= 0) || (count > item.getCount()))
 		{
+			_log.warning(_owner.getName() + ": Attempt to add an item with invalid item count!");
 			return null;
 		}
 		
@@ -251,6 +253,7 @@ public class TradeList
 		{
 			if (checkitem.getObjectId() == objectId)
 			{
+				_log.warning(_owner.getName() + ": Attempt to add an item that is already present!");
 				return null;
 			}
 		}

+ 59 - 62
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -8267,7 +8267,7 @@ public final class L2PcInstance extends L2Playable
 			
 			int buff_index = 0;
 			
-			final List<Integer> storedSkills = new FastList<>();
+			final List<Integer> storedSkills = new ArrayList<>();
 			
 			// Store all effect data along with calulated remaining
 			// reuse delays for matching skills. 'restore_type'= 0.
@@ -8286,7 +8286,6 @@ public final class L2PcInstance extends L2Playable
 					{
 						case HEAL_OVER_TIME:
 						case CPHEAL_OVER_TIME:
-							// TODO: Fix me.
 						case HIDE:
 							continue;
 					}
@@ -8307,7 +8306,6 @@ public final class L2PcInstance extends L2Playable
 					
 					if (effect.isInUse() && !skill.isToggle())
 					{
-						
 						statement.setInt(1, getObjectId());
 						statement.setInt(2, skill.getId());
 						statement.setInt(3, skill.getLevel());
@@ -8612,77 +8610,76 @@ public final class L2PcInstance extends L2Playable
 	@Override
 	public void restoreEffects()
 	{
-		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
+			PreparedStatement statement = con.prepareStatement(RESTORE_SKILL_SAVE))
 		{
-			PreparedStatement statement;
-			ResultSet rset;
-			
-			statement = con.prepareStatement(RESTORE_SKILL_SAVE);
 			statement.setInt(1, getObjectId());
 			statement.setInt(2, getClassIndex());
-			rset = statement.executeQuery();
-			
-			while (rset.next())
+			try (ResultSet rset = statement.executeQuery())
 			{
-				int effectCount = rset.getInt("effect_count");
-				int effectCurTime = rset.getInt("effect_cur_time");
-				long reuseDelay = rset.getLong("reuse_delay");
-				long systime = rset.getLong("systime");
-				int restoreType = rset.getInt("restore_type");
-				
-				final L2Skill skill = SkillTable.getInstance().getInfo(rset.getInt("skill_id"), rset.getInt("skill_level"));
-				if (skill == null)
-				{
-					continue;
-				}
-				
-				final long remainingTime = systime - System.currentTimeMillis();
-				if (remainingTime > 10)
-				{
-					disableSkill(skill, remainingTime);
-					addTimeStamp(skill, reuseDelay, systime);
-				}
-				
-				/**
-				 * Restore Type 1 The remaning skills lost effect upon logout but were still under a high reuse delay.
-				 */
-				if (restoreType > 0)
-				{
-					continue;
-				}
-				
-				/**
-				 * Restore Type 0 These skill were still in effect on the character upon logout. Some of which were self casted and might still have had a long reuse delay which also is restored.
-				 */
-				if (skill.hasEffects())
+				while (rset.next())
 				{
-					Env env = new Env();
-					env.setCharacter(this);
-					env.setTarget(this);
-					env.setSkill(skill);
+					int effectCount = rset.getInt("effect_count");
+					int effectCurTime = rset.getInt("effect_cur_time");
+					long reuseDelay = rset.getLong("reuse_delay");
+					long systime = rset.getLong("systime");
+					int restoreType = rset.getInt("restore_type");
 					
-					L2Effect ef;
-					for (EffectTemplate et : skill.getEffectTemplates())
+					final L2Skill skill = SkillTable.getInstance().getInfo(rset.getInt("skill_id"), rset.getInt("skill_level"));
+					if (skill == null)
 					{
-						ef = et.getEffect(env);
-						if (ef != null)
+						continue;
+					}
+					
+					final long remainingTime = systime - System.currentTimeMillis();
+					if (remainingTime > 10)
+					{
+						disableSkill(skill, remainingTime);
+						addTimeStamp(skill, reuseDelay, systime);
+					}
+					
+					/**
+					 * Restore Type 1 The remaning skills lost effect upon logout but were still under a high reuse delay.
+					 */
+					if (restoreType > 0)
+					{
+						continue;
+					}
+					
+					/**
+					 * Restore Type 0 These skill were still in effect on the character upon logout.<br>
+					 * Some of which were self casted and might still have had a long reuse delay which also is restored.
+					 */
+					if (skill.hasEffects())
+					{
+						final Env env = new Env();
+						env.setCharacter(this);
+						env.setTarget(this);
+						env.setSkill(skill);
+						final L2Effect[] effects = new L2Effect[skill.getEffectTemplates().size()];
+						int index = 0;
+						for (EffectTemplate et : skill.getEffectTemplates())
 						{
-							ef.setCount(effectCount);
-							ef.setFirstTime(effectCurTime);
-							ef.scheduleEffect();
+							L2Effect effect = et.getEffect(env);
+							if (effect != null)
+							{
+								effect.setCount(effectCount);
+								effect.setFirstTime(effectCurTime);
+								effect.scheduleEffect();
+								effects[index++] = effect;
+							}
 						}
+						getEffectList().add(effects);
 					}
 				}
 			}
-			
-			rset.close();
-			statement.close();
-			
-			statement = con.prepareStatement(DELETE_SKILL_SAVE);
-			statement.setInt(1, getObjectId());
-			statement.setInt(2, getClassIndex());
-			statement.executeUpdate();
-			statement.close();
+			// Remove previously restored skills
+			try (PreparedStatement del = con.prepareStatement(DELETE_SKILL_SAVE))
+			{
+				del.setInt(1, getObjectId());
+				del.setInt(2, getClassIndex());
+				del.executeUpdate();
+			}
 		}
 		catch (Exception e)
 		{

+ 20 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java

@@ -1181,19 +1181,28 @@ public class L2PetInstance extends L2Summon
 			
 			for (SummonEffect se : SummonEffectsTable.getInstance().getPetEffects().get(getControlObjectId()))
 			{
-				Env env = new Env();
-				env.setCharacter(this);
-				env.setTarget(this);
-				env.setSkill(se.getSkill());
-				L2Effect ef;
-				for (EffectTemplate et : se.getSkill().getEffectTemplates())
+				if ((se != null) && se.getSkill().hasEffects())
 				{
-					ef = et.getEffect(env);
-					if (ef != null)
+					if (se.getSkill().hasEffects())
 					{
-						ef.setCount(se.getEffectCount());
-						ef.setFirstTime(se.getEffectCurTime());
-						ef.scheduleEffect();
+						final Env env = new Env();
+						env.setCharacter(this);
+						env.setTarget(this);
+						env.setSkill(se.getSkill());
+						final L2Effect[] effects = new L2Effect[se.getSkill().getEffectTemplates().size()];
+						int index = 0;
+						for (EffectTemplate et : se.getSkill().getEffectTemplates())
+						{
+							L2Effect effect = et.getEffect(env);
+							if (effect != null)
+							{
+								effect.setCount(se.getEffectCount());
+								effect.setFirstTime(se.getEffectCurTime());
+								effect.scheduleEffect();
+								effects[index++] = effect;
+							}
+						}
+						getEffectList().add(effects);
 					}
 				}
 			}

+ 20 - 15
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ServitorInstance.java

@@ -507,23 +507,28 @@ public class L2ServitorInstance extends L2Summon
 			
 			for (SummonEffect se : SummonEffectsTable.getInstance().getServitorEffects(getOwner()).get(getReferenceSkill()))
 			{
-				if (se == null)
+				if ((se != null) && se.getSkill().hasEffects())
 				{
-					continue;
-				}
-				Env env = new Env();
-				env.setCharacter(this);
-				env.setTarget(this);
-				env.setSkill(se.getSkill());
-				L2Effect ef;
-				for (EffectTemplate et : se.getSkill().getEffectTemplates())
-				{
-					ef = et.getEffect(env);
-					if (ef != null)
+					if (se.getSkill().hasEffects())
 					{
-						ef.setCount(se.getEffectCount());
-						ef.setFirstTime(se.getEffectCurTime());
-						ef.scheduleEffect();
+						final Env env = new Env();
+						env.setCharacter(this);
+						env.setTarget(this);
+						env.setSkill(se.getSkill());
+						final L2Effect[] effects = new L2Effect[se.getSkill().getEffectTemplates().size()];
+						int index = 0;
+						for (EffectTemplate et : se.getSkill().getEffectTemplates())
+						{
+							L2Effect effect = et.getEffect(env);
+							if (effect != null)
+							{
+								effect.setCount(se.getEffectCount());
+								effect.setFirstTime(se.getEffectCurTime());
+								effect.scheduleEffect();
+								effects[index++] = effect;
+							}
+						}
+						getEffectList().add(effects);
 					}
 				}
 			}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

@@ -1563,7 +1563,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 			return EMPTY_EFFECT_SET;
 		}
 		
-		List<L2Effect> effects = new ArrayList<>(_effectTemplatesSelf.size());
+		final List<L2Effect> effects = new ArrayList<>(_effectTemplatesSelf.size());
 		for (EffectTemplate et : _effectTemplatesSelf)
 		{
 			Env env = new Env();

+ 0 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/AddTradeItem.java

@@ -38,10 +38,6 @@ public final class AddTradeItem extends L2GameClientPacket
 	private int _objectId;
 	private long _count;
 	
-	public AddTradeItem()
-	{
-	}
-	
 	@Override
 	protected void readImpl()
 	{