瀏覽代碼

New skilltype SPAWN.
Parameters: npcId, despawnDelay (in ms, 0 by default), boolean isSummonSpawn (animation on spawn), boolean randomOffset.

_DS_ 15 年之前
父節點
當前提交
6a14969776

+ 90 - 0
L2_GameServer/java/com/l2jserver/gameserver/skills/l2skills/L2SkillSpawn.java

@@ -0,0 +1,90 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.skills.l2skills;
+
+import com.l2jserver.gameserver.datatables.NpcTable;
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.L2Spawn;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.templates.StatsSet;
+import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
+import com.l2jserver.util.Rnd;
+
+public class L2SkillSpawn extends L2Skill
+{
+	private final int _npcId;
+	private final int _despawnDelay;
+	private final boolean _summonSpawn;
+	private final boolean _randomOffset;
+
+	public L2SkillSpawn(StatsSet set)
+	{
+		super(set);
+		_npcId = set.getInteger("npcId", 0);
+		_despawnDelay = set.getInteger("despawnDelay", 0);
+		_summonSpawn = set.getBool("isSummonSpawn", false);
+		_randomOffset = set.getBool("randomOffset", true);
+	}
+
+	@Override
+	public void useSkill(L2Character caster, L2Object[] targets)
+	{
+		if (caster.isAlikeDead())
+			return;
+
+		if (_npcId == 0)
+		{
+			_log.warning("NPC ID not defined for skill ID:"+this.getId());
+			return;
+		}
+
+		final L2NpcTemplate template = NpcTable.getInstance().getTemplate(_npcId);
+		if (template == null)
+		{
+			_log.warning("Spawn of the nonexisting NPC ID:"+_npcId+", skill ID:"+this.getId());
+			return;
+		}
+
+		try
+		{
+			final L2Spawn spawn = new L2Spawn(template);
+			spawn.setInstanceId(caster.getInstanceId());
+			spawn.setHeading(-1);
+
+			if (_randomOffset)
+			{
+				spawn.setLocx(caster.getX() + (Rnd.nextBoolean() ? Rnd.get(20, 50) : Rnd.get(-50, -20)));
+				spawn.setLocy(caster.getY() + (Rnd.nextBoolean() ? Rnd.get(20, 50) : Rnd.get(-50, -20)));
+			}
+			else
+			{
+				spawn.setLocx(caster.getX());
+				spawn.setLocy(caster.getY());
+			}
+			spawn.setLocz(caster.getZ() + 20);
+
+			spawn.stopRespawn();
+			L2Npc npc = spawn.spawnOne(_summonSpawn);
+			if (_despawnDelay > 0)
+				npc.scheduleDespawn(_despawnDelay);
+		}
+		catch (Exception e)
+		{
+			_log.warning("Exception while spawning NPC ID:"+_npcId+", skill ID:"+this.getId()+","+e);
+		}
+	}
+}

+ 2 - 0
L2_GameServer/java/com/l2jserver/gameserver/templates/skills/L2SkillType.java

@@ -30,6 +30,7 @@ import com.l2jserver.gameserver.skills.l2skills.L2SkillMount;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillSiegeFlag;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillSignet;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillSignetCasttime;
+import com.l2jserver.gameserver.skills.l2skills.L2SkillSpawn;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillSummon;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillTeleport;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillTrap;
@@ -144,6 +145,7 @@ public enum L2SkillType
 	ERASE,
 	BETRAY,
 	DECOY(L2SkillDecoy.class),
+	SPAWN(L2SkillSpawn.class),
 	
 	// Cancel
 	CANCEL,