Bläddra i källkod

BETA: Improving hasEffectType method to do not cause such over-heat (Creating lots of new L2Effect objects just to check their EffectType)
* Reviewed by: Zoey76, DrHouse

Rumen Nikiforov 12 år sedan
förälder
incheckning
bdc71856d6
1 ändrade filer med 24 tillägg och 12 borttagningar
  1. 24 12
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

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

@@ -19,6 +19,7 @@
 package com.l2jserver.gameserver.model.skills;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -254,6 +255,8 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	
 	private int _npcId = 0;
 	
+	private byte[] _effectTypes;
+	
 	protected L2Skill(StatsSet set)
 	{
 		_id = set.getInteger("skill_id");
@@ -1994,24 +1997,33 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	 */
 	public boolean hasEffectType(L2EffectType... types)
 	{
-		if (hasEffects())
+		if (hasEffects() && (types != null) && (types.length > 0))
 		{
-			final Env env = new Env();
-			env.setSkill(this);
-			for (EffectTemplate et : _effectTemplates)
+			if (_effectTypes == null)
 			{
-				final L2Effect e = et.getEffect(env, true);
-				if (e == null)
-				{
-					continue;
-				}
+				_effectTypes = new byte[_effectTemplates.length];
+				
+				final Env env = new Env();
+				env.setSkill(this);
 				
-				for (L2EffectType type : types)
+				int i = 0;
+				for (EffectTemplate et : _effectTemplates)
 				{
-					if (e.getEffectType() == type)
+					final L2Effect e = et.getEffect(env, true);
+					if (e == null)
 					{
-						return true;
+						continue;
 					}
+					_effectTypes[i++] = (byte) e.getEffectType().ordinal();
+				}
+				Arrays.sort(_effectTypes);
+			}
+			
+			for (L2EffectType type : types)
+			{
+				if (Arrays.binarySearch(_effectTypes, (byte) type.ordinal()) >= 0)
+				{
+					return true;
 				}
 			}
 		}