FlagZone PwSoft

OldLight2

Знаменитый
Участник
Сообщения
8
Розыгрыши
0
Репутация
0
Реакции
0
Баллы
1 223
Подскажыте как сделать флаг зону в pwsoft вот что то накрабил, компилит норм но работать не хочет, заранее спасибо
Код:
package scripts.zone.type;

import java.util.concurrent.Future;

import net.sf.l2j.gameserver.model.L2Character;
import net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import scripts.zone.L2ZoneType;
import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.util.Rnd;

public class L2FlagZone extends L2ZoneType {

    public L2FlagZone(int id) {
        super(id);
    }

@Override
protected void onEnter(L2Character character)
{
    if (character instanceof L2PcInstance)
    {
        //set pvp flag
        ((L2PcInstance) character).setPvpFlag(1);
        ((L2PcInstance) character).sendMessage("Вы вошли в пвп флаг зону ");
        ((L2PcInstance) character).broadcastUserInfo();
    }
}
@Override
protected void onExit(L2Character character)
{
     if (character instanceof L2PcInstance)
     {
         ((L2PcInstance) character).setPvpFlag(0);
         ((L2PcInstance) character).sendMessage("You left the Pvp Flag zone.");
         ((L2PcInstance) character).broadcastUserInfo();
     }
 }

@Override
public void onDieInside(L2Character character)
{

}  

@Override
public void onReviveInside(L2Character character)
{
    onEnter(character);
    }
}

<zone id='70035' type='FlagZone' shape='NPoly' minZ='-12000' maxZ='12000'>
<stat name='spawnX' val='10468'/> <!-- Coordinates spawn X -->
<stat name='spawnY' val='-24569'/> <!-- Coordinates spawn Y -->
<stat name='spawnZ' val='-3650'/> <!-- Coordinates spawn Z -->
</zone>
 
Что мешает на лету создавать зону, а после того как она уже не нужна - обратно уничтожать?
Или нет такой возможности в пвсофте?
 
Чисто для примера - реализация динамически создаваемой/уничтожаемой зоны для эффекта скилла.
Это для овероподобных, если что.
Код:
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));
		}
	}
}
 
Назад
Сверху Снизу