89 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2004-2015 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 <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| package handlers.effecthandlers;
 | |
| 
 | |
| import com.l2jserver.Config;
 | |
| import com.l2jserver.gameserver.GeoData;
 | |
| import com.l2jserver.gameserver.ai.CtrlIntention;
 | |
| import com.l2jserver.gameserver.model.Location;
 | |
| import com.l2jserver.gameserver.model.StatsSet;
 | |
| import com.l2jserver.gameserver.model.actor.L2Character;
 | |
| import com.l2jserver.gameserver.model.conditions.Condition;
 | |
| import com.l2jserver.gameserver.model.effects.AbstractEffect;
 | |
| import com.l2jserver.gameserver.model.skills.BuffInfo;
 | |
| import com.l2jserver.gameserver.network.serverpackets.FlyToLocation;
 | |
| import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType;
 | |
| import com.l2jserver.gameserver.network.serverpackets.ValidateLocation;
 | |
| import com.l2jserver.gameserver.util.Util;
 | |
| 
 | |
| /**
 | |
|  * Blink effect implementation.<br>
 | |
|  * This class handles warp effects, disappear and quickly turn up in a near location.<br>
 | |
|  * If geodata enabled and an object is between initial and final point, flight is stopped just before colliding with object.<br>
 | |
|  * Flight course and radius are set as skill properties (flyCourse and flyRadius):
 | |
|  * <ul>
 | |
|  * <li>Fly Radius means the distance between starting point and final point, it must be an integer.</li>
 | |
|  * <li>Fly Course means the movement direction: imagine a compass above player's head, making north player's heading. So if fly course is 180, player will go backwards (good for blink, e.g.).</li>
 | |
|  * </ul>
 | |
|  * By the way, if flyCourse = 360 or 0, player will be moved in in front of him. <br>
 | |
|  * If target is effector, put in XML self="1", this will make _actor = getEffector(). This, combined with target type, allows more complex actions like flying target's backwards or player's backwards.
 | |
|  * @author DrHouse
 | |
|  */
 | |
| public final class Blink extends AbstractEffect
 | |
| {
 | |
| 	public Blink(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 | |
| 	{
 | |
| 		super(attachCond, applyCond, set, params);
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public boolean isInstant()
 | |
| 	{
 | |
| 		return true;
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public void onStart(BuffInfo info)
 | |
| 	{
 | |
| 		final L2Character effected = info.getEffected();
 | |
| 		final int radius = info.getSkill().getFlyRadius();
 | |
| 		final double angle = Util.convertHeadingToDegree(effected.getHeading());
 | |
| 		final double radian = Math.toRadians(angle);
 | |
| 		final double course = Math.toRadians(info.getSkill().getFlyCourse());
 | |
| 		final int x1 = (int) (Math.cos(Math.PI + radian + course) * radius);
 | |
| 		final int y1 = (int) (Math.sin(Math.PI + radian + course) * radius);
 | |
| 		
 | |
| 		int x = effected.getX() + x1;
 | |
| 		int y = effected.getY() + y1;
 | |
| 		int z = effected.getZ();
 | |
| 		Location loc = new Location(x, y, z);
 | |
| 		if (Config.GEODATA > 0)
 | |
| 		{
 | |
| 			loc = GeoData.getInstance().moveCheck(effected.getX(), effected.getY(), effected.getZ(), x, y, z, effected.getInstanceId());
 | |
| 		}
 | |
| 		
 | |
| 		effected.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
 | |
| 		effected.broadcastPacket(new FlyToLocation(effected, loc.getX(), loc.getY(), loc.getZ(), FlyType.DUMMY));
 | |
| 		effected.abortAttack();
 | |
| 		effected.abortCast();
 | |
| 		effected.setXYZ(loc);
 | |
| 		effected.broadcastPacket(new ValidateLocation(effected));
 | |
| 	}
 | |
| }
 | 
