/*
* 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 silentium.gameserver.skills.effects;
import silentium.gameserver.ai.CtrlIntention;
import silentium.gameserver.configs.MainConfig;
import silentium.gameserver.geo.GeoData;
import silentium.gameserver.model.L2Effect;
import silentium.gameserver.model.Location;
import silentium.gameserver.model.actor.L2Character;
import silentium.gameserver.network.serverpackets.FlyToLocation;
import silentium.gameserver.network.serverpackets.FlyToLocation.FlyType;
import silentium.gameserver.network.serverpackets.ValidateLocation;
import silentium.gameserver.skills.Env;
import silentium.gameserver.templates.skills.L2EffectType;
import silentium.gameserver.utils.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): <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.). By the way, if flyCourse = 360 or 0, player will be moved in in front of him. <br>
* <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.<br>
* <br>
*
* @author House
*/
public class EffectWarp extends L2Effect
{
private int x, y, z;
private L2Character _actor;
public EffectWarp(Env env, EffectTemplate template)
{
super(env, template);
}
@Override
public L2EffectType getEffectType()
{
return L2EffectType.WARP;
}
@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 (MainConfig.GEODATA > 0)
{
Location destiny = GeoData.getInstance().moveCheck(_actor.getX(), _actor.getY(), _actor.getZ(), x, y, z);
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;
}
@Override
public boolean onActionTime()
{
return false;
}
}