/*
* 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 .
*/
package com.l2jserver.gameserver.skills.effects;
import com.l2jserver.Config;
import com.l2jserver.gameserver.GeoData;
import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.model.L2Effect;
import com.l2jserver.gameserver.model.Location;
import com.l2jserver.gameserver.model.actor.L2Character;
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.skills.Env;
import com.l2jserver.gameserver.templates.effects.EffectTemplate;
import com.l2jserver.gameserver.templates.skills.L2EffectType;
import com.l2jserver.gameserver.util.Util;
/**
* This class handles warp effects, disappear and quickly turn up in a near
* location. If geodata enabled and an object is between initial and final
* point, flight is stopped just before colliding with object. Flight course and
* radius are set as skill properties (flyCourse and flyRadius):
*
*
Fly Radius means the distance between starting point and final point, it
* must be an integer. 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.). By the way,
* if flyCourse = 360 or 0, player will be moved in in front of him.
*
*
* 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 House
*/
public class EffectWarp extends L2Effect
{
private int x, y, z;
private L2Character _actor;
public EffectWarp(Env env, EffectTemplate template)
{
super(env, template);
}
/**
*
* @see com.l2jserver.gameserver.model.L2Effect#getEffectType()
*/
@Override
public L2EffectType getEffectType()
{
return L2EffectType.WARP;
}
/**
*
* @see com.l2jserver.gameserver.model.L2Effect#onStart()
*/
@Override
public boolean onStart()
{
_actor = isSelfEffect() ? getEffector() : getEffected();
if (_actor.isMovementDisabled())
return false;
int _radius = getSkill().getFlyRadius();
double angle = Util.convertHeadingToDegree(_actor.getHeading());
double radian = Math.toRadians(angle);
double course = Math.toRadians(getSkill().getFlyCourse());
int x1 = (int) (Math.cos(Math.PI + radian + course) * _radius);
int y1 = (int) (Math.sin(Math.PI + radian + course) * _radius);
x = _actor.getX() + x1;
y = _actor.getY() + y1;
z = _actor.getZ();
if (Config.GEODATA > 0)
{
Location destiny = GeoData.getInstance().moveCheck(_actor.getX(), _actor.getY(), _actor.getZ(), x, y, z, _actor.getInstanceId());
x = destiny.getX();
y = destiny.getY();
z = destiny.getZ();
}
// TODO: check if this AI intention is retail-like. This stops player's
// previous movement
_actor.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
_actor.broadcastPacket(new FlyToLocation(_actor, x, y, z, FlyType.DUMMY));
_actor.abortAttack();
_actor.abortCast();
_actor.setXYZ(x, y, z);
_actor.broadcastPacket(new ValidateLocation(_actor));
return true;
}
/**
*
* @see com.l2jserver.gameserver.model.L2Effect#onActionTime()
*/
@Override
public boolean onActionTime()
{
return false;
}
}