/* * Copyright (C) 2004-2013 L2J DataPack * * This file is part of L2J DataPack. * * L2J DataPack 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 DataPack 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 . */ package handlers.skillhandlers; import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.handler.ISkillHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.skills.L2Skill; import com.l2jserver.gameserver.model.skills.L2SkillType; import com.l2jserver.gameserver.model.stats.Formulas; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.FlyToLocation; import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.network.serverpackets.ValidateLocation; import com.l2jserver.gameserver.util.Util; /** * Some parts taken from EffectWarp, which cannot be used for this case. * @author Didldak */ public class InstantJump implements ISkillHandler { private static final L2SkillType[] SKILL_IDS = { L2SkillType.INSTANT_JUMP }; @Override public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets) { L2Character target = (L2Character) targets[0]; if (Formulas.calcPhysicalSkillEvasion(target, skill)) { if (activeChar.isPlayer()) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_DODGES_ATTACK); sm.addString(target.getName()); activeChar.getActingPlayer().sendPacket(sm); } if (target.isPlayer()) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.AVOIDED_C1_ATTACK); sm.addString(activeChar.getName()); target.getActingPlayer().sendPacket(sm); } return; } int x = 0, y = 0, z = 0; int px = target.getX(); int py = target.getY(); double ph = Util.convertHeadingToDegree(target.getHeading()); ph += 180; if (ph > 360) { ph -= 360; } ph = (Math.PI * ph) / 180; x = (int) (px + (25 * Math.cos(ph))); y = (int) (py + (25 * Math.sin(ph))); z = target.getZ(); Location loc = new Location(x, y, z); if (Config.GEODATA > 0) { loc = GeoData.getInstance().moveCheck(activeChar.getX(), activeChar.getY(), activeChar.getZ(), x, y, z, activeChar.getInstanceId()); } activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); activeChar.broadcastPacket(new FlyToLocation(activeChar, loc.getX(), loc.getY(), loc.getZ(), FlyType.DUMMY)); activeChar.abortAttack(); activeChar.abortCast(); activeChar.setXYZ(loc.getX(), loc.getY(), loc.getZ()); activeChar.broadcastPacket(new ValidateLocation(activeChar)); if (skill.hasEffects()) { if (Formulas.calcSkillReflect(target, skill) == Formulas.SKILL_REFLECT_SUCCEED) { activeChar.stopSkillEffects(skill.getId()); skill.getEffects(target, activeChar); // SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT); // sm.addSkillName(skill); // activeChar.sendPacket(sm); } else { // activate attacked effects, if any target.stopSkillEffects(skill.getId()); skill.getEffects(activeChar, target); } } } @Override public L2SkillType[] getSkillIds() { return SKILL_IDS; } }