package l2p.gameserver.model.skills.effects;
import org.apache.commons.lang3.StringUtils;
import l2p.commons.collections.StatsSet;
import l2p.commons.geometry.Circle;
import l2p.gameserver.enums.FlyType;
import l2p.gameserver.enums.ZoneType;
import l2p.gameserver.holders.world.ZoneTemplate;
import l2p.gameserver.listener.zone.OnZoneEnterLeaveListener;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.Location;
import l2p.gameserver.model.Territory;
import l2p.gameserver.model.Zone;
import l2p.gameserver.model.skills.Effect;
import l2p.gameserver.network.s2c.FlyToLocation;
import l2p.gameserver.network.s2c.ValidateLocation;
import l2p.gameserver.stats.Env;
import l2p.gameserver.utils.PositionUtils;
public class EffectTwistedSpace extends Effect
{
private Zone _zone = null;
private ZoneListener _listener = null;
public EffectTwistedSpace(Env env, EffectTemplate template)
{
super(env, template);
}
@Override
public void onStart()
{
super.onStart();
int radius = (int) calc();
Circle c = new Circle(_effected.getLoc(), radius);
c.setZmax(_effected.getLoc().z + radius / 2);
c.setZmin(_effected.getLoc().z - radius / 2);
StatsSet set = new StatsSet();
set.set("name", StringUtils.EMPTY);
set.set("type", ZoneType.dummy);
set.set("territory", new Territory().add(c));
_listener = new ZoneListener();
_zone = new Zone(new ZoneTemplate(set));
_zone.setReflection(_effected.getReflection());
_zone.addListener(_listener);
_zone.setActive(true);
}
@Override
public void onExit()
{
super.onExit();
_zone.removeListener(_listener);
_zone.setActive(false);
_zone = null;
}
@Override
public boolean onTick()
{
return true;
}
@Override
public boolean isSaveable()
{
return false;
}
private class ZoneListener implements OnZoneEnterLeaveListener
{
@Override
public void onZoneEnter(Zone zone, Creature actor)
{}
@Override
public void onZoneLeave(Zone zone, Creature actor)
{
if (actor == _effected || actor == _effector || !actor.isAutoAttackable(_effector, null))
return;
if (zone.checkIfInZone(actor.getX(), actor.getY(), actor.getZ(), actor.getReflection()))
return;
double angle = PositionUtils.convertHeadingToDegree(actor.getHeading());
double radian = Math.toRadians(angle - 90);
int x = (int) (actor.getX() + 100 * Math.sin(radian));
int y = (int) (actor.getY() - 100 * Math.cos(radian));
int z = actor.getZ();
Location flyLoc = new Location(x, y, z);
actor.abortAttack(true, false);
actor.abortCast(true, false);
actor.stopMove(true);
actor.broadcastPacket(new FlyToLocation(actor, flyLoc, FlyType.PULL, 600));
actor.setLoc(flyLoc);
actor.broadcastPacket(new ValidateLocation(actor));
}
}
}