2
0
Эх сурвалжийг харах

BETA: Reworking traps:
* Removing hardcoded skill handler L2SkillTrap.
* L2PcInstance minor cleanup.
* Removed L2Trap.
* Reworked L2TrapInstance, now extends L2Npc not L2Character.
* Moved trap related runnable tasks to proper files and package.
* Reworked ConditionPlayerRangeFromNpc in a more retail like way.
* Allows list of NPC Ids.
* Allows expected value.

Zoey76 12 жил өмнө
parent
commit
0240532e3c
15 өөрчлөгдсөн 544 нэмэгдсэн , 709 устгасан
  1. 11 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentBase.java
  2. 1 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Object.java
  3. 8 11
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Npc.java
  4. 0 400
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Trap.java
  5. 3 21
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  6. 305 128
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TrapInstance.java
  7. 6 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/knownlist/TrapKnownList.java
  8. 92 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/npc/trap/TrapTask.java
  9. 50 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/npc/trap/TrapTriggerTask.java
  10. 41 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/npc/trap/TrapUnsummonTask.java
  11. 18 14
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerRangeFromNpc.java
  12. 5 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/Quest.java
  13. 1 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2SkillType.java
  14. 0 107
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/l2skills/L2SkillTrap.java
  15. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java

+ 11 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentBase.java

@@ -744,15 +744,19 @@ public abstract class DocumentBase
 			}
 			else if ("npcIdRadius".equalsIgnoreCase(a.getNodeName()))
 			{
-				StringTokenizer st = new StringTokenizer(a.getNodeValue(), ",");
-				int npcId = 0;
-				int radius = 0;
-				if (st.countTokens() > 1)
+				final StringTokenizer st = new StringTokenizer(a.getNodeValue(), ",");
+				if (st.countTokens() == 3)
 				{
-					npcId = Integer.decode(getValue(st.nextToken().trim(), null));
-					radius = Integer.decode(getValue(st.nextToken().trim(), null));
+					final String[] ids = st.nextToken().split(";");
+					final int[] npcIds = new int[ids.length];
+					for (int index = 0; index < ids.length; index++)
+					{
+						npcIds[index] = Integer.parseInt(getValue(ids[index], template));
+					}
+					final int radius = Integer.parseInt(st.nextToken());
+					final boolean val = Boolean.parseBoolean(st.nextToken());
+					cond = joinAnd(cond, new ConditionPlayerRangeFromNpc(npcIds, radius, val));
 				}
-				cond = joinAnd(cond, new ConditionPlayerRangeFromNpc(npcId, radius));
 			}
 			else if ("canSweep".equalsIgnoreCase(a.getNodeName()))
 			{

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Object.java

@@ -77,7 +77,6 @@ public abstract class L2Object
 		L2Playable(L2Character),
 		L2Summon(L2Playable),
 		L2Decoy(L2Character),
-		L2Trap(L2Character),
 		L2PcInstance(L2Playable),
 		L2NpcInstance(L2Npc),
 		L2MerchantInstance(L2NpcInstance),
@@ -93,7 +92,7 @@ public abstract class L2Object
 		L2PetInstance(L2Summon),
 		L2BabyPetInstance(L2PetInstance),
 		L2DecoyInstance(L2Decoy),
-		L2TrapInstance(L2Trap),
+		L2TrapInstance(L2Npc),
 		// Attackable
 		L2Attackable(L2Npc),
 		L2GuardInstance(L2Attackable),

+ 8 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Npc.java

@@ -965,22 +965,21 @@ public class L2Npc extends L2Character
 	}
 	
 	/**
-	 * Return null (regular NPCs don't have weapons instancies).
+	 * Return null (regular NPCs don't have weapons instances).
 	 */
 	@Override
 	public L2ItemInstance getActiveWeaponInstance()
 	{
-		// regular NPCs dont have weapons instancies
 		return null;
 	}
 	
 	/**
-	 * Return the weapon item equiped in the right hand of the L2NpcInstance or null.
+	 * Return the weapon item equipped in the right hand of the L2NpcInstance or null.
 	 */
 	@Override
 	public L2Weapon getActiveWeaponItem()
 	{
-		// Get the weapon identifier equiped in the right hand of the L2NpcInstance
+		// Get the weapon identifier equipped in the right hand of the L2NpcInstance
 		int weaponId = getTemplate().getRightHand();
 		
 		if (weaponId < 1)
@@ -988,7 +987,7 @@ public class L2Npc extends L2Character
 			return null;
 		}
 		
-		// Get the weapon item equiped in the right hand of the L2NpcInstance
+		// Get the weapon item equipped in the right hand of the L2NpcInstance
 		L2Item item = ItemTable.getInstance().getTemplate(getTemplate().getRightHand());
 		
 		if (!(item instanceof L2Weapon))
@@ -1000,30 +999,28 @@ public class L2Npc extends L2Character
 	}
 	
 	/**
-	 * Return null (regular NPCs don't have weapons instancies).
+	 * Return null (regular NPCs don't have weapons instances).
 	 */
 	@Override
 	public L2ItemInstance getSecondaryWeaponInstance()
 	{
-		// regular NPCs dont have weapons instancies
 		return null;
 	}
 	
 	/**
-	 * Return the weapon item equiped in the left hand of the L2NpcInstance or null.
+	 * Return the weapon item equipped in the left hand of the L2NpcInstance or null.
 	 */
 	@Override
 	public L2Weapon getSecondaryWeaponItem()
 	{
-		// Get the weapon identifier equiped in the right hand of the L2NpcInstance
+		// Get the weapon identifier equipped in the right hand of the L2NpcInstance
 		int weaponId = getTemplate().getLeftHand();
-		
 		if (weaponId < 1)
 		{
 			return null;
 		}
 		
-		// Get the weapon item equiped in the right hand of the L2NpcInstance
+		// Get the weapon item equipped in the right hand of the L2NpcInstance
 		L2Item item = ItemTable.getInstance().getTemplate(getTemplate().getLeftHand());
 		
 		if (!(item instanceof L2Weapon))

+ 0 - 400
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Trap.java

@@ -1,400 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.model.actor;
-
-import java.util.Collection;
-import java.util.logging.Level;
-
-import com.l2jserver.gameserver.ThreadPoolManager;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.knownlist.TrapKnownList;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
-import com.l2jserver.gameserver.model.items.L2Weapon;
-import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.model.quest.Quest;
-import com.l2jserver.gameserver.model.quest.Quest.TrapAction;
-import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.network.serverpackets.AbstractNpcInfo;
-import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
-import com.l2jserver.gameserver.network.serverpackets.SocialAction;
-import com.l2jserver.gameserver.taskmanager.DecayTaskManager;
-
-/**
- * @author nBd
- */
-public class L2Trap extends L2Character
-{
-	protected static final int TICK = 1000; // 1s
-	
-	protected boolean _isTriggered;
-	protected final L2Skill _skill;
-	protected final int _lifeTime;
-	protected int _timeRemaining;
-	protected boolean _hasLifeTime;
-	
-	/**
-	 * @param objectId
-	 * @param template
-	 * @param lifeTime
-	 * @param skill
-	 */
-	public L2Trap(int objectId, L2NpcTemplate template, int lifeTime, L2Skill skill)
-	{
-		super(objectId, template);
-		setInstanceType(InstanceType.L2Trap);
-		setName(template.getName());
-		setIsInvul(false);
-		
-		_isTriggered = false;
-		_skill = skill;
-		_hasLifeTime = true;
-		if (lifeTime != 0)
-		{
-			_lifeTime = lifeTime;
-		}
-		else
-		{
-			_lifeTime = 30000;
-		}
-		_timeRemaining = _lifeTime;
-		if (lifeTime < 0)
-		{
-			_hasLifeTime = false;
-		}
-		
-		if (skill != null)
-		{
-			ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(), TICK);
-		}
-	}
-	
-	@Override
-	public TrapKnownList getKnownList()
-	{
-		return (TrapKnownList) super.getKnownList();
-	}
-	
-	@Override
-	public void initKnownList()
-	{
-		setKnownList(new TrapKnownList(this));
-	}
-	
-	@Override
-	public boolean isAutoAttackable(L2Character attacker)
-	{
-		return !canSee(attacker);
-	}
-	
-	public void stopDecay()
-	{
-		DecayTaskManager.getInstance().cancelDecayTask(this);
-	}
-	
-	@Override
-	public void onDecay()
-	{
-		deleteMe();
-	}
-	
-	/**
-	 * @return
-	 */
-	public final int getNpcId()
-	{
-		return getTemplate().getNpcId();
-	}
-	
-	@Override
-	public boolean doDie(L2Character killer)
-	{
-		if (!super.doDie(killer))
-		{
-			return false;
-		}
-		
-		DecayTaskManager.getInstance().addDecayTask(this);
-		return true;
-	}
-	
-	@Override
-	public void deleteMe()
-	{
-		decayMe();
-		getKnownList().removeAllKnownObjects();
-		super.deleteMe();
-	}
-	
-	public synchronized void unSummon()
-	{
-		if (isVisible() && !isDead())
-		{
-			if (getWorldRegion() != null)
-			{
-				getWorldRegion().removeFromZones(this);
-			}
-			
-			deleteMe();
-		}
-	}
-	
-	@Override
-	public L2ItemInstance getActiveWeaponInstance()
-	{
-		return null;
-	}
-	
-	@Override
-	public L2Weapon getActiveWeaponItem()
-	{
-		return null;
-	}
-	
-	@Override
-	public int getLevel()
-	{
-		return getTemplate().getLevel();
-	}
-	
-	@Override
-	public L2NpcTemplate getTemplate()
-	{
-		return (L2NpcTemplate) super.getTemplate();
-	}
-	
-	@Override
-	public L2ItemInstance getSecondaryWeaponInstance()
-	{
-		return null;
-	}
-	
-	@Override
-	public L2Weapon getSecondaryWeaponItem()
-	{
-		return null;
-	}
-	
-	@Override
-	public void updateAbnormalEffect()
-	{
-		
-	}
-	
-	public L2Skill getSkill()
-	{
-		return _skill;
-	}
-	
-	public L2PcInstance getOwner()
-	{
-		return null;
-	}
-	
-	public int getKarma()
-	{
-		return 0;
-	}
-	
-	public byte getPvpFlag()
-	{
-		return 0;
-	}
-	
-	/**
-	 * Checks is triggered
-	 * @return True if trap is triggered.
-	 */
-	public boolean isTriggered()
-	{
-		return _isTriggered;
-	}
-	
-	/**
-	 * Checks trap visibility
-	 * @param cha - checked character
-	 * @return True if character can see trap
-	 */
-	public boolean canSee(L2Character cha)
-	{
-		return false;
-	}
-	
-	/**
-	 * Reveal trap to the detector (if possible)
-	 * @param detector
-	 */
-	public void setDetected(L2Character detector)
-	{
-		detector.sendPacket(new AbstractNpcInfo.TrapInfo(this, detector));
-	}
-	
-	/**
-	 * Check if target can trigger trap
-	 * @param target
-	 * @return
-	 */
-	protected boolean checkTarget(L2Character target)
-	{
-		return L2Skill.checkForAreaOffensiveSkills(this, target, _skill, false);
-	}
-	
-	protected class TrapTask implements Runnable
-	{
-		@Override
-		public void run()
-		{
-			try
-			{
-				if (!_isTriggered)
-				{
-					if (_hasLifeTime)
-					{
-						_timeRemaining -= TICK;
-						if (_timeRemaining < (_lifeTime - 15000))
-						{
-							SocialAction sa = new SocialAction(getObjectId(), 2);
-							broadcastPacket(sa);
-						}
-						if (_timeRemaining < 0)
-						{
-							switch (getSkill().getTargetType())
-							{
-								case AURA:
-								case FRONT_AURA:
-								case BEHIND_AURA:
-									trigger(L2Trap.this);
-									break;
-								default:
-									unSummon();
-							}
-							return;
-						}
-					}
-					
-					for (L2Character target : getKnownList().getKnownCharactersInRadius(_skill.getAffectRange()))
-					{
-						if (!checkTarget(target))
-						{
-							continue;
-						}
-						
-						trigger(target);
-						return;
-					}
-					
-					ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(), TICK);
-				}
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.SEVERE, "", e);
-				unSummon();
-			}
-		}
-	}
-	
-	/**
-	 * Trigger trap
-	 * @param target
-	 */
-	public void trigger(L2Character target)
-	{
-		_isTriggered = true;
-		broadcastPacket(new AbstractNpcInfo.TrapInfo(this, null));
-		setTarget(target);
-		
-		if (getTemplate().getEventQuests(Quest.QuestEventType.ON_TRAP_ACTION) != null)
-		{
-			for (Quest quest : getTemplate().getEventQuests(Quest.QuestEventType.ON_TRAP_ACTION))
-			{
-				quest.notifyTrapAction(this, target, TrapAction.TRAP_TRIGGERED);
-			}
-		}
-		
-		ThreadPoolManager.getInstance().scheduleGeneral(new TriggerTask(), 300);
-	}
-	
-	protected class TriggerTask implements Runnable
-	{
-		@Override
-		public void run()
-		{
-			try
-			{
-				doCast(_skill);
-				ThreadPoolManager.getInstance().scheduleGeneral(new UnsummonTask(), _skill.getHitTime() + 300);
-			}
-			catch (Exception e)
-			{
-				unSummon();
-			}
-		}
-	}
-	
-	protected class UnsummonTask implements Runnable
-	{
-		@Override
-		public void run()
-		{
-			unSummon();
-		}
-	}
-	
-	@Override
-	public void sendInfo(L2PcInstance activeChar)
-	{
-		if (_isTriggered || canSee(activeChar))
-		{
-			activeChar.sendPacket(new AbstractNpcInfo.TrapInfo(this, activeChar));
-		}
-	}
-	
-	@Override
-	public void broadcastPacket(L2GameServerPacket mov)
-	{
-		Collection<L2PcInstance> plrs = getKnownList().getKnownPlayers().values();
-		for (L2PcInstance player : plrs)
-		{
-			if ((player != null) && (_isTriggered || canSee(player)))
-			{
-				player.sendPacket(mov);
-			}
-		}
-	}
-	
-	@Override
-	public void broadcastPacket(L2GameServerPacket mov, int radiusInKnownlist)
-	{
-		Collection<L2PcInstance> plrs = getKnownList().getKnownPlayers().values();
-		for (L2PcInstance player : plrs)
-		{
-			if (player == null)
-			{
-				continue;
-			}
-			if (isInsideRadius(player, radiusInKnownlist, false, false))
-			{
-				if (_isTriggered || canSee(player))
-				{
-					player.sendPacket(mov);
-				}
-			}
-		}
-	}
-}

+ 3 - 21
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -145,7 +145,6 @@ import com.l2jserver.gameserver.model.actor.L2Decoy;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.L2Summon;
-import com.l2jserver.gameserver.model.actor.L2Trap;
 import com.l2jserver.gameserver.model.actor.L2Vehicle;
 import com.l2jserver.gameserver.model.actor.appearance.PcAppearance;
 import com.l2jserver.gameserver.model.actor.knownlist.PcKnownList;
@@ -226,7 +225,6 @@ import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSiegeFlag;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSummon;
-import com.l2jserver.gameserver.model.skills.l2skills.L2SkillTrap;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Formulas;
@@ -678,7 +676,7 @@ public final class L2PcInstance extends L2Playable
 	/** The L2Decoy of the L2PcInstance */
 	private L2Decoy _decoy = null;
 	/** The L2Trap of the L2PcInstance */
-	private L2Trap _trap = null;
+	private L2TrapInstance _trap = null;
 	/** The L2Agathion of the L2PcInstance */
 	private int _agathionId = 0;
 	// apparently, a L2PcInstance CAN have both a summon AND a tamed beast at the same time!!
@@ -4411,22 +4409,6 @@ public final class L2PcInstance extends L2Playable
 		
 		switch (skill.getSkillType())
 		{
-			case SUMMON_TRAP:
-			{
-				if (isInsideZone(ZoneId.PEACE))
-				{
-					sendPacket(SystemMessageId.A_MALICIOUS_SKILL_CANNOT_BE_USED_IN_PEACE_ZONE);
-					return false;
-				}
-				if ((getTrap() != null) && (getTrap().getSkill().getId() == ((L2SkillTrap) skill).getTriggerSkillId()))
-				{
-					SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
-					sm.addSkillName(skill);
-					sendPacket(sm);
-					return false;
-				}
-				break;
-			}
 			case SUMMON:
 			{
 				if (!((L2SkillSummon) skill).isCubic() && (hasSummon() || isMounted() || CharSummonTable.getInstance().getPets().contains(getObjectId()) || CharSummonTable.getInstance().getPets().contains(getObjectId())))
@@ -6306,7 +6288,7 @@ public final class L2PcInstance extends L2Playable
 	/**
 	 * @return the L2Trap of the L2PcInstance or null.
 	 */
-	public L2Trap getTrap()
+	public L2TrapInstance getTrap()
 	{
 		return _trap;
 	}
@@ -6333,7 +6315,7 @@ public final class L2PcInstance extends L2Playable
 	 * Set the L2Trap of this L2PcInstance
 	 * @param trap
 	 */
-	public void setTrap(L2Trap trap)
+	public void setTrap(L2TrapInstance trap)
 	{
 		_trap = trap;
 	}

+ 305 - 128
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TrapInstance.java

@@ -18,89 +18,209 @@
  */
 package com.l2jserver.gameserver.model.actor.instance;
 
+import java.util.ArrayList;
 import java.util.List;
 
-import javolution.util.FastList;
-
+import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.actor.L2Trap;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.knownlist.TrapKnownList;
+import com.l2jserver.gameserver.model.actor.tasks.npc.trap.TrapTask;
+import com.l2jserver.gameserver.model.actor.tasks.npc.trap.TrapTriggerTask;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
+import com.l2jserver.gameserver.model.items.L2Weapon;
+import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.olympiad.OlympiadGameManager;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.Quest.TrapAction;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.AbstractNpcInfo.TrapInfo;
+import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.taskmanager.DecayTaskManager;
 
-public class L2TrapInstance extends L2Trap
+/**
+ * Trap instance.
+ * @author Zoey76
+ */
+public final class L2TrapInstance extends L2Npc
 {
-	private L2PcInstance _owner;
-	private int _level;
+	private static final int TICK = 1000; // 1s
+	private boolean _hasLifeTime;
 	private boolean _isInArena = false;
-	private final List<Integer> _playersWhoDetectedMe = new FastList<>();
+	private boolean _isTriggered;
+	private final int _lifeTime;
+	private L2PcInstance _owner;
+	private final List<Integer> _playersWhoDetectedMe = new ArrayList<>();
+	private L2Skill _skill;
+	private int _remainingTime;
 	
-	/**
-	 * @param objectId
-	 * @param template
-	 * @param owner
-	 * @param lifeTime
-	 * @param skill
-	 */
-	public L2TrapInstance(int objectId, L2NpcTemplate template, L2PcInstance owner, int lifeTime, L2Skill skill)
+	public L2TrapInstance(int objectId, L2NpcTemplate template, int instanceId, int lifeTime)
 	{
-		super(objectId, template, lifeTime, skill);
+		super(objectId, template);
 		setInstanceType(InstanceType.L2TrapInstance);
+		setInstanceId(instanceId);
+		setName(template.getName());
+		setIsInvul(false);
 		
-		setInstanceId(owner.getInstanceId());
-		
-		_owner = owner;
-		_level = owner.getLevel();
+		_owner = null;
+		_isTriggered = false;
+		// TODO: Manage this properly when NPC templates are complete and in XML.
+		for (L2Skill skill : template.getSkills().values())
+		{
+			_skill = skill; // Last skill
+		}
+		_hasLifeTime = lifeTime >= 0;
+		_lifeTime = lifeTime != 0 ? lifeTime : 30000;
+		_remainingTime = _lifeTime;
+		if (_skill != null)
+		{
+			ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(this), TICK);
+		}
 	}
 	
-	public L2TrapInstance(int objectId, L2NpcTemplate template, int instanceId, int lifeTime, L2Skill skill)
+	public L2TrapInstance(int objectId, L2NpcTemplate template, L2PcInstance owner, int lifeTime)
 	{
-		super(objectId, template, lifeTime, skill);
+		super(objectId, template);
 		setInstanceType(InstanceType.L2TrapInstance);
+		setInstanceId(owner.getInstanceId());
+		setName(template.getName());
+		setIsInvul(false);
 		
-		setInstanceId(instanceId);
-		
-		_owner = null;
-		if (skill != null)
+		_owner = owner;
+		_isTriggered = false;
+		// TODO: Manage this properly when NPC templates are complete and in XML.
+		for (L2Skill skill : template.getSkills().values())
 		{
-			_level = skill.getLevel();
+			_skill = skill; // Last skill
 		}
-		else
+		_hasLifeTime = lifeTime >= 0;
+		_lifeTime = lifeTime != 0 ? lifeTime : 30000;
+		_remainingTime = getLifeTime();
+		if (_skill != null)
 		{
-			_level = 1;
+			ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(this), TICK);
 		}
 	}
 	
 	@Override
-	public int getLevel()
+	public void broadcastPacket(L2GameServerPacket mov)
 	{
-		return _level;
+		for (L2PcInstance player : getKnownList().getKnownPlayers().values())
+		{
+			if ((player != null) && (_isTriggered || canBeSeen(player)))
+			{
+				player.sendPacket(mov);
+			}
+		}
 	}
 	
 	@Override
-	public L2PcInstance getOwner()
+	public void broadcastPacket(L2GameServerPacket mov, int radiusInKnownlist)
 	{
-		return _owner;
+		for (L2PcInstance player : getKnownList().getKnownPlayers().values())
+		{
+			if ((player != null) && isInsideRadius(player, radiusInKnownlist, false, false) && (_isTriggered || canBeSeen(player)))
+			{
+				player.sendPacket(mov);
+			}
+		}
 	}
 	
-	@Override
-	public L2PcInstance getActingPlayer()
+	/**
+	 * Verify if the character can see the trap.
+	 * @param cha the character to verify
+	 * @return {@code true} if the character can see the trap, {@code false} otherwise
+	 */
+	public boolean canBeSeen(L2Character cha)
 	{
-		return _owner;
+		if ((cha != null) && _playersWhoDetectedMe.contains(cha.getObjectId()))
+		{
+			return true;
+		}
+		
+		if ((_owner == null) || (cha == null))
+		{
+			return false;
+		}
+		if (cha == _owner)
+		{
+			return true;
+		}
+		
+		if (cha instanceof L2PcInstance)
+		{
+			// observers can't see trap
+			if (((L2PcInstance) cha).inObserverMode())
+			{
+				return false;
+			}
+			
+			// olympiad competitors can't see trap
+			if (_owner.isInOlympiadMode() && ((L2PcInstance) cha).isInOlympiadMode() && (((L2PcInstance) cha).getOlympiadSide() != _owner.getOlympiadSide()))
+			{
+				return false;
+			}
+		}
+		
+		if (_isInArena)
+		{
+			return true;
+		}
+		
+		if (_owner.isInParty() && cha.isInParty() && (_owner.getParty().getLeaderObjectId() == cha.getParty().getLeaderObjectId()))
+		{
+			return true;
+		}
+		return false;
 	}
 	
-	@Override
-	public void onSpawn()
+	public boolean checkTarget(L2Character target)
 	{
-		super.onSpawn();
-		_isInArena = isInsideZone(ZoneId.PVP) && !isInsideZone(ZoneId.SIEGE);
-		_playersWhoDetectedMe.clear();
+		if (!L2Skill.checkForAreaOffensiveSkills(this, target, _skill, _isInArena))
+		{
+			return false;
+		}
+		
+		// observers
+		if ((target instanceof L2PcInstance) && ((L2PcInstance) target).inObserverMode())
+		{
+			return false;
+		}
+		
+		// olympiad own team and their summons not attacked
+		if ((_owner != null) && _owner.isInOlympiadMode())
+		{
+			final L2PcInstance player = target.getActingPlayer();
+			if ((player != null) && player.isInOlympiadMode() && (player.getOlympiadSide() == _owner.getOlympiadSide()))
+			{
+				return false;
+			}
+		}
+		
+		if (_isInArena)
+		{
+			return true;
+		}
+		
+		// trap owned by players not attack non-flagged players
+		if (_owner != null)
+		{
+			if (target instanceof L2Attackable)
+			{
+				return true;
+			}
+			
+			final L2PcInstance player = target.getActingPlayer();
+			if ((player == null) || ((player.getPvpFlag() == 0) && (player.getKarma() == 0)))
+			{
+				return false;
+			}
+		}
+		return true;
 	}
 	
 	@Override
@@ -115,28 +235,94 @@ public class L2TrapInstance extends L2Trap
 	}
 	
 	@Override
-	public void unSummon()
+	public L2PcInstance getActingPlayer()
 	{
-		if (_owner != null)
-		{
-			_owner.setTrap(null);
-			_owner = null;
-		}
-		super.unSummon();
+		return _owner;
 	}
 	
 	@Override
+	public L2Weapon getActiveWeaponItem()
+	{
+		return null;
+	}
+	
 	public int getKarma()
 	{
 		return _owner != null ? _owner.getKarma() : 0;
 	}
 	
 	@Override
+	public TrapKnownList getKnownList()
+	{
+		return (TrapKnownList) super.getKnownList();
+	}
+	
+	/**
+	 * Get the owner of this trap.
+	 * @return the owner
+	 */
+	public L2PcInstance getOwner()
+	{
+		return _owner;
+	}
+	
 	public byte getPvpFlag()
 	{
 		return _owner != null ? _owner.getPvpFlag() : 0;
 	}
 	
+	@Override
+	public L2ItemInstance getSecondaryWeaponInstance()
+	{
+		return null;
+	}
+	
+	@Override
+	public L2Weapon getSecondaryWeaponItem()
+	{
+		return null;
+	}
+	
+	public L2Skill getSkill()
+	{
+		return _skill;
+	}
+	
+	@Override
+	public void initKnownList()
+	{
+		setKnownList(new TrapKnownList(this));
+	}
+	
+	@Override
+	public boolean isAutoAttackable(L2Character attacker)
+	{
+		return !canBeSeen(attacker);
+	}
+	
+	@Override
+	public boolean isTrap()
+	{
+		return true;
+	}
+	
+	/**
+	 * Checks is triggered
+	 * @return True if trap is triggered.
+	 */
+	public boolean isTriggered()
+	{
+		return _isTriggered;
+	}
+	
+	@Override
+	public void onSpawn()
+	{
+		super.onSpawn();
+		_isInArena = isInsideZone(ZoneId.PVP) && !isInsideZone(ZoneId.SIEGE);
+		_playersWhoDetectedMe.clear();
+	}
+	
 	@Override
 	public void sendDamageMessage(L2Character target, int damage, boolean mcrit, boolean pcrit, boolean miss)
 	{
@@ -150,82 +336,44 @@ public class L2TrapInstance extends L2Trap
 			OlympiadGameManager.getInstance().notifyCompetitorDamage(getOwner(), damage);
 		}
 		
-		final SystemMessage sm;
-		
 		if (target.isInvul() && !(target instanceof L2NpcInstance))
 		{
-			sm = SystemMessage.getSystemMessage(SystemMessageId.ATTACK_WAS_BLOCKED);
+			_owner.sendPacket(SystemMessageId.ATTACK_WAS_BLOCKED);
 		}
 		else
 		{
-			sm = SystemMessage.getSystemMessage(SystemMessageId.C1_DONE_S3_DAMAGE_TO_C2);
+			final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_DONE_S3_DAMAGE_TO_C2);
 			sm.addCharName(this);
 			sm.addCharName(target);
 			sm.addNumber(damage);
+			_owner.sendPacket(sm);
 		}
-		
-		_owner.sendPacket(sm);
 	}
 	
 	@Override
-	public boolean canSee(L2Character cha)
+	public void sendInfo(L2PcInstance activeChar)
 	{
-		if ((cha != null) && _playersWhoDetectedMe.contains(cha.getObjectId()))
-		{
-			return true;
-		}
-		
-		if ((_owner == null) || (cha == null))
-		{
-			return false;
-		}
-		if (cha == _owner)
-		{
-			return true;
-		}
-		
-		if (cha instanceof L2PcInstance)
-		{
-			// observers can't see trap
-			if (((L2PcInstance) cha).inObserverMode())
-			{
-				return false;
-			}
-			
-			// olympiad competitors can't see trap
-			if (_owner.isInOlympiadMode() && ((L2PcInstance) cha).isInOlympiadMode() && (((L2PcInstance) cha).getOlympiadSide() != _owner.getOlympiadSide()))
-			{
-				return false;
-			}
-		}
-		
-		if (_isInArena)
-		{
-			return true;
-		}
-		
-		if (_owner.isInParty() && cha.isInParty() && (_owner.getParty().getLeaderObjectId() == cha.getParty().getLeaderObjectId()))
+		if (_isTriggered || canBeSeen(activeChar))
 		{
-			return true;
+			activeChar.sendPacket(new TrapInfo(this, activeChar));
 		}
-		
-		return false;
 	}
 	
-	@Override
 	public void setDetected(L2Character detector)
 	{
 		if (_isInArena)
 		{
-			super.setDetected(detector);
+			detector.sendPacket(new TrapInfo(this, detector));
 			return;
 		}
+		
 		if ((_owner != null) && (_owner.getPvpFlag() == 0) && (_owner.getKarma() == 0))
 		{
 			return;
 		}
 		
 		_playersWhoDetectedMe.add(detector.getObjectId());
+		
 		if (getTemplate().getEventQuests(Quest.QuestEventType.ON_TRAP_ACTION) != null)
 		{
 			for (Quest quest : getTemplate().getEventQuests(Quest.QuestEventType.ON_TRAP_ACTION))
@@ -233,58 +381,87 @@ public class L2TrapInstance extends L2Trap
 				quest.notifyTrapAction(this, detector, TrapAction.TRAP_DETECTED);
 			}
 		}
-		super.setDetected(detector);
+		detector.sendPacket(new TrapInfo(this, detector));
 	}
 	
-	@Override
-	protected boolean checkTarget(L2Character target)
+	public void stopDecay()
 	{
-		if (!L2Skill.checkForAreaOffensiveSkills(this, target, getSkill(), _isInArena))
-		{
-			return false;
-		}
-		
-		// observers
-		if ((target instanceof L2PcInstance) && ((L2PcInstance) target).inObserverMode())
-		{
-			return false;
-		}
+		DecayTaskManager.getInstance().cancelDecayTask(this);
+	}
+	
+	/**
+	 * Trigger the trap.
+	 * @param target the target
+	 */
+	public void triggerTrap(L2Character target)
+	{
+		_isTriggered = true;
+		broadcastPacket(new TrapInfo(this, null));
+		setTarget(target);
 		
-		// olympiad own team and their summons not attacked
-		if ((_owner != null) && _owner.isInOlympiadMode())
+		if (getTemplate().getEventQuests(Quest.QuestEventType.ON_TRAP_ACTION) != null)
 		{
-			final L2PcInstance player = target.getActingPlayer();
-			if ((player != null) && player.isInOlympiadMode() && (player.getOlympiadSide() == _owner.getOlympiadSide()))
+			for (Quest quest : getTemplate().getEventQuests(Quest.QuestEventType.ON_TRAP_ACTION))
 			{
-				return false;
+				quest.notifyTrapAction(this, target, TrapAction.TRAP_TRIGGERED);
 			}
 		}
 		
-		if (_isInArena)
+		ThreadPoolManager.getInstance().scheduleGeneral(new TrapTriggerTask(this), 300);
+	}
+	
+	public void unSummon()
+	{
+		if (_owner != null)
 		{
-			return true;
+			_owner.setTrap(null);
+			_owner = null;
 		}
 		
-		// trap owned by players not attack non-flagged players
-		if (_owner != null)
+		if (isVisible() && !isDead())
 		{
-			final L2PcInstance player = target.getActingPlayer();
-			if (target instanceof L2Attackable)
-			{
-				return true;
-			}
-			else if ((player == null) || ((player.getPvpFlag() == 0) && (player.getKarma() == 0)))
+			if (getWorldRegion() != null)
 			{
-				return false;
+				getWorldRegion().removeFromZones(this);
 			}
+			
+			deleteMe();
 		}
-		
-		return true;
 	}
 	
 	@Override
-	public boolean isTrap()
+	public void updateAbnormalEffect()
 	{
-		return true;
+		
+	}
+	
+	public boolean hasLifeTime()
+	{
+		return _hasLifeTime;
+	}
+	
+	public void setHasLifeTime(boolean val)
+	{
+		_hasLifeTime = val;
+	}
+	
+	public int getRemainingTime()
+	{
+		return _remainingTime;
+	}
+	
+	public void setRemainingTime(int time)
+	{
+		_remainingTime = time;
+	}
+	
+	public void setSkill(L2Skill _skill)
+	{
+		this._skill = _skill;
+	}
+	
+	public int getLifeTime()
+	{
+		return _lifeTime;
 	}
 }

+ 6 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/knownlist/TrapKnownList.java

@@ -19,25 +19,25 @@
 package com.l2jserver.gameserver.model.actor.knownlist;
 
 import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.actor.L2Trap;
+import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
 
-public class TrapKnownList extends CharKnownList
+public class TrapKnownList extends NpcKnownList
 {
-	public TrapKnownList(L2Trap activeChar)
+	public TrapKnownList(L2TrapInstance activeChar)
 	{
 		super(activeChar);
 	}
 	
 	@Override
-	public final L2Trap getActiveChar()
+	public final L2TrapInstance getActiveChar()
 	{
-		return (L2Trap) super.getActiveChar();
+		return (L2TrapInstance) super.getActiveChar();
 	}
 	
 	@Override
 	public int getDistanceToForgetObject(L2Object object)
 	{
-		if ((object == getActiveChar().getOwner()) || (object == getActiveChar().getTarget()))
+		if ((object == getActiveChar().getActingPlayer()) || (object == getActiveChar().getTarget()))
 		{
 			return 6000;
 		}

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

@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+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;
+
+/**
+ * Trap task.
+ * @author Zoey76
+ */
+public class TrapTask implements Runnable
+{
+	private static final Logger _log = Logger.getLogger(TrapTask.class.getName());
+	private static final int TICK = 1000; // 1s
+	private final L2TrapInstance _trap;
+	
+	public TrapTask(L2TrapInstance trap)
+	{
+		_trap = trap;
+	}
+	
+	@Override
+	public void run()
+	{
+		try
+		{
+			if (!_trap.isTriggered())
+			{
+				if (_trap.hasLifeTime())
+				{
+					_trap.setRemainingTime(_trap.getRemainingTime() - TICK);
+					if (_trap.getRemainingTime() < (_trap.getLifeTime() - 15000))
+					{
+						_trap.broadcastPacket(new SocialAction(_trap.getObjectId(), 2));
+					}
+					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()))
+				{
+					if (!_trap.checkTarget(target))
+					{
+						continue;
+					}
+					_trap.triggerTrap(target);
+					return;
+				}
+				
+				ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(_trap), TICK);
+			}
+		}
+		catch (Exception e)
+		{
+			_log.severe(L2TrapInstance.class.getSimpleName() + ": " + e.getMessage());
+			_trap.unSummon();
+		}
+	}
+}

+ 50 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/npc/trap/TrapTriggerTask.java

@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.actor.tasks.npc.trap;
+
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
+
+/**
+ * Trap trigger task.
+ * @author Zoey76
+ */
+public class TrapTriggerTask implements Runnable
+{
+	private final L2TrapInstance _trap;
+	
+	public TrapTriggerTask(L2TrapInstance trap)
+	{
+		_trap = trap;
+	}
+	
+	@Override
+	public void run()
+	{
+		try
+		{
+			_trap.doCast(_trap.getSkill());
+			ThreadPoolManager.getInstance().scheduleGeneral(new TrapUnsummonTask(_trap), _trap.getSkill().getHitTime() + 300);
+		}
+		catch (Exception e)
+		{
+			_trap.unSummon();
+		}
+	}
+}

+ 41 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/npc/trap/TrapUnsummonTask.java

@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.actor.tasks.npc.trap;
+
+import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
+
+/**
+ * Trap unsummon task.
+ * @author Zoey76
+ */
+public class TrapUnsummonTask implements Runnable
+{
+	private final L2TrapInstance _trap;
+	
+	public TrapUnsummonTask(L2TrapInstance trap)
+	{
+		_trap = trap;
+	}
+	
+	@Override
+	public void run()
+	{
+		_trap.unSummon();
+	}
+}

+ 18 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerRangeFromNpc.java

@@ -21,39 +21,43 @@ package com.l2jserver.gameserver.model.conditions;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.util.Util;
 
 /**
- * @author UnAfraid
+ * Exist NPC condition.
+ * @author UnAfraid, Zoey76
  */
 public class ConditionPlayerRangeFromNpc extends Condition
 {
-	private final int _npcId;
+	/** NPC Ids. */
+	private final int[] _npcIds;
+	/** Radius to check. */
 	private final int _radius;
+	/** Expected value. */
+	private final boolean _val;
 	
-	public ConditionPlayerRangeFromNpc(int npcId, int radius)
+	public ConditionPlayerRangeFromNpc(int[] npcIds, int radius, boolean val)
 	{
-		_npcId = npcId;
+		_npcIds = npcIds;
 		_radius = radius;
+		_val = val;
 	}
 	
 	@Override
 	public boolean testImpl(Env env)
 	{
-		if ((_npcId == 0) || (_radius == 0))
+		boolean existNpc = false;
+		if ((_npcIds != null) && (_npcIds.length > 0) && (_radius > 0))
 		{
-			return false;
-		}
-		
-		for (L2Character target : env.getCharacter().getKnownList().getKnownCharactersInRadius(_radius))
-		{
-			if (target instanceof L2Npc)
+			for (L2Character target : env.getCharacter().getKnownList().getKnownCharactersInRadius(_radius))
 			{
-				if (((L2Npc) target).getNpcId() == _npcId)
+				if (target.isNpc() && Util.contains(_npcIds, ((L2Npc) target).getNpcId()))
 				{
-					return true;
+					existNpc = true;
+					break;
 				}
 			}
 		}
-		return false;
+		return existNpc == _val;
 	}
 }

+ 5 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/Quest.java

@@ -53,7 +53,6 @@ import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.L2Trap;
 import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -685,7 +684,7 @@ public class Quest extends ManagedScript
 	 * @param trigger the character which makes effect on the trap
 	 * @param action 0: trap casting its skill. 1: trigger detects the trap. 2: trigger removes the trap
 	 */
-	public final void notifyTrapAction(L2Trap trap, L2Character trigger, TrapAction action)
+	public final void notifyTrapAction(L2TrapInstance trap, L2Character trigger, TrapAction action)
 	{
 		String res = null;
 		try
@@ -1388,7 +1387,7 @@ public class Quest extends ManagedScript
 	 * @param action this parameter contains a reference to the action that was triggered.
 	 * @return
 	 */
-	public String onTrapAction(L2Trap trap, L2Character trigger, TrapAction action)
+	public String onTrapAction(L2TrapInstance trap, L2Character trigger, TrapAction action)
 	{
 		return null;
 	}
@@ -2801,17 +2800,15 @@ public class Quest extends ManagedScript
 	 * @param instanceId
 	 * @return
 	 */
-	public L2Trap addTrap(int trapId, int x, int y, int z, int heading, L2Skill skill, int instanceId)
+	public L2TrapInstance addTrap(int trapId, int x, int y, int z, int heading, L2Skill skill, int instanceId)
 	{
-		L2NpcTemplate TrapTemplate = NpcTable.getInstance().getTemplate(trapId);
-		L2Trap trap = new L2TrapInstance(IdFactory.getInstance().getNextId(), TrapTemplate, instanceId, -1, skill);
+		final L2NpcTemplate npcTemplate = NpcTable.getInstance().getTemplate(trapId);
+		L2TrapInstance trap = new L2TrapInstance(IdFactory.getInstance().getNextId(), npcTemplate, instanceId, -1);
 		trap.setCurrentHp(trap.getMaxHp());
 		trap.setCurrentMp(trap.getMaxMp());
 		trap.setIsInvul(true);
 		trap.setHeading(heading);
-		// L2World.getInstance().storeObject(trap);
 		trap.spawnMe(x, y, z);
-		
 		return trap;
 	}
 	

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

@@ -28,9 +28,9 @@ import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSignet;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSignetCasttime;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSummon;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillTeleport;
-import com.l2jserver.gameserver.model.skills.l2skills.L2SkillTrap;
 
 /**
+ * Skill type enumerated.
  * @author nBd
  */
 public enum L2SkillType
@@ -108,7 +108,6 @@ public enum L2SkillType
 	BEAST_SKILL,
 	BEAST_ACCOMPANY,
 	TRANSFORMDISPEL,
-	SUMMON_TRAP(L2SkillTrap.class),
 	DETECT_TRAP,
 	REMOVE_TRAP,
 	SHIFT_TARGET,

+ 0 - 107
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/l2skills/L2SkillTrap.java

@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.model.skills.l2skills;
-
-import com.l2jserver.gameserver.datatables.NpcTable;
-import com.l2jserver.gameserver.datatables.SkillTable;
-import com.l2jserver.gameserver.idfactory.IdFactory;
-import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.L2Spawn;
-import com.l2jserver.gameserver.model.StatsSet;
-import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.actor.L2Trap;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
-import com.l2jserver.gameserver.model.skills.L2Skill;
-
-public class L2SkillTrap extends L2SkillSummon
-{
-	private int _triggerSkillId = 0;
-	private int _triggerSkillLvl = 0;
-	protected L2Spawn _trapSpawn;
-	
-	/**
-	 * @param set
-	 */
-	public L2SkillTrap(StatsSet set)
-	{
-		super(set);
-		_triggerSkillId = set.getInteger("triggerSkillId");
-		_triggerSkillLvl = set.getInteger("triggerSkillLvl");
-	}
-	
-	public int getTriggerSkillId()
-	{
-		return _triggerSkillId;
-	}
-	
-	@Override
-	public void useSkill(L2Character caster, L2Object[] targets)
-	{
-		if (caster.isAlikeDead() || !caster.isPlayer())
-		{
-			return;
-		}
-		
-		if (getNpcId() == 0)
-		{
-			return;
-		}
-		
-		L2PcInstance activeChar = caster.getActingPlayer();
-		
-		if (activeChar.inObserverMode())
-		{
-			return;
-		}
-		
-		if (activeChar.isMounted())
-		{
-			return;
-		}
-		
-		if ((_triggerSkillId == 0) || (_triggerSkillLvl == 0))
-		{
-			return;
-		}
-		
-		L2Trap trap = activeChar.getTrap();
-		if (trap != null)
-		{
-			trap.unSummon();
-		}
-		
-		L2Skill skill = SkillTable.getInstance().getInfo(_triggerSkillId, _triggerSkillLvl);
-		
-		if (skill == null)
-		{
-			return;
-		}
-		
-		L2NpcTemplate TrapTemplate = NpcTable.getInstance().getTemplate(getNpcId());
-		trap = new L2TrapInstance(IdFactory.getInstance().getNextId(), TrapTemplate, activeChar, getTotalLifeTime(), skill);
-		trap.setCurrentHp(trap.getMaxHp());
-		trap.setCurrentMp(trap.getMaxMp());
-		trap.setIsInvul(true);
-		trap.setHeading(activeChar.getHeading());
-		activeChar.setTrap(trap);
-		trap.spawnMe(activeChar.getX(), activeChar.getY(), activeChar.getZ());
-	}
-}

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java

@@ -26,10 +26,10 @@ import com.l2jserver.gameserver.model.PcCondOverride;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Summon;
-import com.l2jserver.gameserver.model.actor.L2Trap;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
 import com.l2jserver.gameserver.model.effects.AbnormalEffect;
 import com.l2jserver.gameserver.model.stats.MoveType;
 import com.l2jserver.gameserver.model.zone.ZoneId;
@@ -204,9 +204,9 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 	
 	public static class TrapInfo extends AbstractNpcInfo
 	{
-		private final L2Trap _trap;
+		private final L2TrapInstance _trap;
 		
-		public TrapInfo(L2Trap cha, L2Character attacker)
+		public TrapInfo(L2TrapInstance cha, L2Character attacker)
 		{
 			super(cha);