소스 검색

BETA: Fixing traps not using skills.
* Improved trap tasks, now no new task are created every second.

Reported by: Pandragon

Zoey76 11 년 전
부모
커밋
5f69023703

+ 1 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcData.java

@@ -31,7 +31,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -53,15 +52,13 @@ import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.skills.Skill;
 
 /**
+ * NPC data parser.
  * @author Nos
  */
 public class NpcData extends DocumentParser
 {
-	private static final Logger _log = Logger.getLogger(NpcData.class.getName());
-	
 	private final Map<Integer, L2NpcTemplate> _npcs = new ConcurrentHashMap<>();
 	private final Map<String, Integer> _clans = new ConcurrentHashMap<>();
-	
 	// SQL Queries
 	private static final String SELECT_MINION_ALL = "SELECT * FROM minions ORDER BY boss_id";
 	

+ 21 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TrapInstance.java

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.model.actor.instance;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ScheduledFuture;
 
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.enums.InstanceType;
@@ -60,6 +61,8 @@ public final class L2TrapInstance extends L2Npc
 	private final List<Integer> _playersWhoDetectedMe = new ArrayList<>();
 	private final SkillHolder _skill;
 	private int _remainingTime;
+	// Tasks
+	private ScheduledFuture<?> _trapTask = null;
 	
 	public L2TrapInstance(int objectId, L2NpcTemplate template, int instanceId, int lifeTime)
 	{
@@ -77,7 +80,7 @@ public final class L2TrapInstance extends L2Npc
 		_remainingTime = _lifeTime;
 		if (_skill != null)
 		{
-			ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(this), TICK);
+			_trapTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new TrapTask(this), TICK, TICK);
 		}
 	}
 	
@@ -166,6 +169,11 @@ public final class L2TrapInstance extends L2Npc
 			return false;
 		}
 		
+		if (!target.isInsideRadius(this, _skill.getSkill().getEffectRange(), false, false))
+		{
+			return false;
+		}
+		
 		// observers
 		if ((target instanceof L2PcInstance) && ((L2PcInstance) target).inObserverMode())
 		{
@@ -382,6 +390,12 @@ public final class L2TrapInstance extends L2Npc
 	 */
 	public void triggerTrap(L2Character target)
 	{
+		if (_trapTask != null)
+		{
+			_trapTask.cancel(true);
+			_trapTask = null;
+		}
+		
 		_isTriggered = true;
 		broadcastPacket(new TrapInfo(this, null));
 		setTarget(target);
@@ -399,6 +413,12 @@ public final class L2TrapInstance extends L2Npc
 	
 	public void unSummon()
 	{
+		if (_trapTask != null)
+		{
+			_trapTask.cancel(true);
+			_trapTask = null;
+		}
+		
 		if (_owner != null)
 		{
 			_owner.setTrap(null);

+ 10 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/npc/trap/TrapTask.java

@@ -20,7 +20,6 @@ package com.l2jserver.gameserver.model.actor.tasks.npc.trap;
 
 import java.util.logging.Logger;
 
-import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
 import com.l2jserver.gameserver.network.serverpackets.SocialAction;
@@ -54,38 +53,39 @@ public class TrapTask implements Runnable
 					{
 						_trap.broadcastPacket(new SocialAction(_trap.getObjectId(), 2));
 					}
-					if (_trap.getRemainingTime() < 0)
+					if (_trap.getRemainingTime() <= 0)
 					{
 						switch (_trap.getSkill().getTargetType())
 						{
 							case AURA:
 							case FRONT_AURA:
 							case BEHIND_AURA:
+							{
 								_trap.triggerTrap(_trap);
 								break;
+							}
 							default:
+							{
 								_trap.unSummon();
+							}
 						}
 						return;
 					}
 				}
 				
-				for (L2Character target : _trap.getKnownList().getKnownCharactersInRadius(_trap.getSkill().getAffectRange()))
+				for (L2Character target : _trap.getKnownList().getKnownCharacters())
 				{
-					if (!_trap.checkTarget(target))
+					if (_trap.checkTarget(target))
 					{
-						continue;
+						_trap.triggerTrap(target);
+						break;
 					}
-					_trap.triggerTrap(target);
-					return;
 				}
-				
-				ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(_trap), TICK);
 			}
 		}
 		catch (Exception e)
 		{
-			_log.severe(L2TrapInstance.class.getSimpleName() + ": " + e.getMessage());
+			_log.severe(TrapTask.class.getSimpleName() + ": " + e.getMessage());
 			_trap.unSummon();
 		}
 	}