Перейти к содержанию
Авторизация  
Sky03611

Проблема с Fear

Рекомендуемые сообщения

Суть такая. Сборка interlude.su(не закидывайте помидорами)

когда кидают фир, он проходит все ок. перс отворачивается, но стоит на месте не убегает. Исходники присутствуют же. Что можно сделать? Заранее спасибо.

<skill id="1092" levels="19" name="Fear">
  <table name="#mpConsume_Init"> 3 4 5 6 6 7 8 9 10 11 11 11 12 12 13 13 13 14 14 </table>
  <table name="#mpConsume"> 12 16 18 21 24 28 31 35 38 41 43 44 46 48 49 51 52 53 55 </table>
  <table name="#magicLvl"> 14 20 25 30 35 40 44 48 52 56 58 60 62 64 66 68 70 72 74 </table>
  <set name="mpInitialConsume" val="#mpConsume_Init"/>
  <set name="mpConsume" val="#mpConsume"/>
  <set name="power" val="20"/>
  <set name="magicLvl" val="#magicLvl"/>
  <set name="target" val="TARGET_ONE"/>
  <set name="reuseDelay" val="20000"/>
  <set name="hitTime" val="4000"/>
  <set name="skillType" val="FEAR"/>
  <set name="isMagic" val="true"/>
  <set name="isDebuff" val="true"/>
  <set name="operateType" val="OP_ACTIVE"/>
  <set name="castRange" val="600"/>
  <set name="effectRange" val="1100"/>
  <for>
    <effect count="5" name="Fear" time="2" val="0"/>
  </for>
</skill>
Изменено пользователем Sky03611

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как минимум скажу , не в дп дело ....

 

Пусть меня исправят, если я не прав!

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Исходники присутствуют же. 

Я согласен что не в дп

/*
 * 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 ru.catssoftware.gameserver.skills.effects;

import ru.catssoftware.gameserver.ai.CtrlIntention;
import ru.catssoftware.gameserver.geodata.GeoData;
import ru.catssoftware.gameserver.model.L2CharPosition;
import ru.catssoftware.gameserver.model.L2Effect;
import ru.catssoftware.gameserver.model.actor.instance.L2FolkInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2FortCommanderInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2FortSiegeGuardInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PetInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2SiegeFlagInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2SiegeGuardInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2SiegeSummonInstance;
import ru.catssoftware.gameserver.skills.Env;
import ru.catssoftware.gameserver.templates.skills.L2EffectType;
//import java.util.logging.Logger;

import ru.catssoftware.tools.random.Rnd;

/**
 * @author littlecrow
 *
 * Implementation of the Fear Effect
 */
public final class EffectFear extends L2Effect {

    public static final int FEAR_RANGE = 200;
    //protected static Logger				_log				= Logger.getLogger(EffectFear.class.getName());
    //private static Map<Integer, float[]> _deltas = new FastMap<Integer, float[]>();

    public EffectFear(Env env, EffectTemplate template) {
        super(env, template);
    }

    @Override
    public L2EffectType getEffectType() {
        return L2EffectType.FEAR;
    }

    /** Notify started */
    @Override
    public boolean onStart() {
        // Fear skills cannot be used L2Pcinstance to L2Pcinstance.
        // Heroic Dread, Curse: Fear, Fear, Horror, Sword Symphony, Word of Fear and Mass Curse Fear are the exceptions.
        if (getEffected() instanceof L2PcInstance && getEffector() instanceof L2PcInstance) {
            switch (getSkill().getId()) {
                case 65:
                case 98:
                case 1092:
                case 1169:
                case 1272:
                case 1376:
                case 1381:
                    // all ok
                    break;
                default:
                    return false;
            }
        }

        if (getEffected() instanceof L2FolkInstance || getEffected() instanceof L2SiegeGuardInstance || getEffected() instanceof L2SiegeFlagInstance
                || getEffected() instanceof L2SiegeSummonInstance || getEffected() instanceof L2FortSiegeGuardInstance
                || getEffected() instanceof L2FortCommanderInstance) {
            return false;
        }

        if (!getEffected().isAfraid()) {
            /*float _dX = getEffector().getX() - getEffected().getX();
            float _dY = getEffector().getY() - getEffected().getY();
            
            if (_dX == 0) {
            _dX = 0;
            if (_dY > 0) {
            _dY = -1;
            } else {
            _dY = 1;
            }
            } else if (_dY == 0) {
            _dY = 0;
            if (_dX > 0) {
            _dX = -1;
            } else {
            _dX = 1;
            }
            } else if (_dX > 0 && _dY > 0) {
            //_log.warning("Situation A-NW ("+_dX+";"+_dY+")");
            if (_dX > _dY) {
            _dY = -1 * _dY / _dX;
            _dX = -1;
            } else {
            _dX = -1 * _dX / _dY;
            _dY = -1;
            }
            } else if (_dX > 0 && _dY < 0) {
            //_log.warning("Situation B-SW ("+_dX+";"+_dY+")");
            if (_dX > (-1 * _dY)) {
            _dY = -1 * (_dY / _dX);
            _dX = -1;
            } else {
            _dX = _dX / _dY;
            _dY = 1;
            }
            } else if (_dX < 0 && _dY > 0) {
            //_log.warning("Situation C-NE ("+_dX+";"+_dY+")");
            if ((-1 * _dX) > _dY) {
            _dY = _dY / _dX;
            _dX = 1;
            } else {
            _dX = -1 * (_dX / _dY);
            _dY = -1;
            }
            } else if (_dX < 0 && _dY < 0) {
            //_log.warning("Situation D-SE ("+_dX+";"+_dY+")");
            if (_dX > _dY) {
            _dY = _dY / _dX;
            _dX = 1;
            } else {
            _dX = _dX / _dY;
            _dY = 1;
            }
            } else if (_dX == 0 && _dY == 0) {
            //_log.warning("Situation X");
            _dX = -1;
            _dY = -1;
            }
            _deltas.put(getEffected().getObjectId(), new float[]{_dX, _dY});*/
            getEffected().startFear();
            onActionTime();
            return true;
        }
        return false;
    }

    /** Notify exited */
    @Override
    public void onExit() {
        getEffected().stopFear(this);
        getEffected().setTarget(null);
        getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
        //_deltas.remove(getEffected().getObjectId());
    }

    @Override
    public boolean onActionTime() {
        if (getEffected().getFirstEffect(getId()) == null) {
            onExit();
        }

        int posX = getEffected().getX();
        int posY = getEffected().getY();
        int posZ = getEffected().getZ();
        //float[] delta = _deltas.get(getEffected().getObjectId());
        /*float _dX = -1;
        float _dY = -1;
        if (delta != null) {
        _dX = delta[0];
        _dY = delta[1];
        }
        //_log.warning("Start Position on Fear. X: " + posX + "  Y: " + posY);
        if (_dX != 0) {
        posX += _dX * FEAR_RANGE;
        }
        if (_dY != 0) {
        posY += _dY * FEAR_RANGE;
        }*/
        //_log.warning("Next Position on Fear. X: " + posX + "  Y: " + posY);
        //Location destiny = GeoData.getInstance().moveCheck(getEffected().getX(), getEffected().getY(), getEffected().getZ(), posX, posY, posZ, getEffected().getInstanceId());
        if (!(getEffected() instanceof L2PetInstance)) {
            getEffected().setRunning();
        }
        switch (Rnd.get(1, 6)) {
            case 1:
                posX += 40;
                posY += 180;
                break;
            case 2:
                posX += 150;
                posY += 50;
                break;
            case 3:
                posX += 69;
                posY -= 100;
                break;
            case 4:
                posX += 10;
                posY -= 100;
                break;
            case 5:
                posX -= 150;
                posY -= 20;
                break;
            case 6:
                posX -= 100;
                posY += 60;
                break;
        }

        if (GeoData.getInstance().canSeeTarget(getEffected().getX(), getEffected().getY(), getEffected().getZ(), posX, posY, posZ)/*GeoData.getInstance().canMoveFromToTarget(getEffected().getX(), getEffected().getY(), getEffected().getZ(), posX, posY, posZ, getEffected().getInstanceId())*/) {
            getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(posX, posY, posZ, 0));
        }

        // Give damage if "val" > 0
        double damage = calc();
        if (damage != 0) {
            getEffected().reduceCurrentHp(damage, getEffector(), true, true, getSkill());
        }
        return true;
    }
}
Изменено пользователем Sky03611

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как минимум скажу , не в дп дело ....

 

Пусть меня исправят, если я не прав!

Да вы правы дело не в дп.

Советую ТС'у самостоятельно поискать а не просить помощи, это вам только пойдет на пользу так как работы на ит.су хватает.

Копайте в сторону Paralize.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да вы правы дело не в дп.

Советую ТС'у самостоятельно поискать а не просить помощи, это вам только пойдет на пользу так как работы на ит.су хватает.

Копайте в сторону Paralize.

cпасибо за совет, буду пробовать.

 

Если еще есть кто нибудь с советом я буду только рад

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UP. Ahtharas terror чуть чуть срабатывает, перс делает 2 шага и останавливается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/*

 * 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 ru.catssoftware.gameserver.skills.effects;
 
import java.util.Map;
 
import ru.catssoftware.gameserver.ai.CtrlIntention;
import ru.catssoftware.gameserver.geodata.GeoData;
import ru.catssoftware.gameserver.model.L2CharPosition;
import ru.catssoftware.gameserver.model.L2Effect;
import ru.catssoftware.gameserver.model.Location;
import ru.catssoftware.gameserver.model.actor.instance.L2FolkInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2FortCommanderInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2FortSiegeGuardInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PetInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2SiegeFlagInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2SiegeGuardInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2SiegeSummonInstance;
import ru.catssoftware.gameserver.skills.Env;
import ru.catssoftware.gameserver.templates.skills.L2EffectType;
//import java.util.logging.Logger;
 
import javolution.util.FastMap;
import ru.catssoftware.tools.random.Rnd;
 
/**
 * @@Authority littlecrow
 *
 * Implementation of the Fear Effect
 */
public final class EffectFear extends L2Effect {
 
    public static final int FEAR_RANGE = 500;
    //protected static Logger _log = Logger.getLogger(EffectFear.class.getName());
    private static Map<Integer, float[]> _deltas = new FastMap<Integer, float[]>();
 
    public EffectFear(Env env, EffectTemplate template) {
        super(env, template);
    }
 
    @@override
    public L2EffectType getEffectType() {
        return L2EffectType.FEAR;
    }
 
    /** Notify started */
    @@override
    public boolean onStart() {
        // Fear skills cannot be used L2Pcinstance to L2Pcinstance.
        // Heroic Dread, Curse: Fear, Fear, Horror, Sword Symphony, Word of Fear and Mass Curse Fear are the exceptions.
        if (getEffected() instanceof L2PcInstance && getEffector() instanceof L2PcInstance) {
            switch (getSkill().getId()) {
                case 65:
                case 98:
                case 1092:
                case 1169:
                case 1272:
                case 1376:
                case 1381:
                    // all ok
                    break;
                default:
                    return false;
            }
        }
 
        if (getEffected() instanceof L2FolkInstance || getEffected() instanceof L2SiegeGuardInstance || getEffected() instanceof L2SiegeFlagInstance
                || getEffected() instanceof L2SiegeSummonInstance || getEffected() instanceof L2FortSiegeGuardInstance
                || getEffected() instanceof L2FortCommanderInstance) {
            return false;
        }
 
        if (!getEffected().isAfraid()) {
            float _dX = getEffector().getX() - getEffected().getX();
            float _dY = getEffector().getY() - getEffected().getY();
            
            if (_dX == 0) {
            _dX = 0;
            if (_dY > 0) {
            _dY = -1;
            } else {
            _dY = 1;
            }
            } else if (_dY == 0) {
            _dY = 0;
            if (_dX > 0) {
            _dX = -1;
            } else {
            _dX = 1;
            }
            } else if (_dX > 0 && _dY > 0) {
            //_log.warning("Situation A-NW ("+_dX+";"+_dY+")");
            if (_dX > _dY) {
            _dY = -1 * _dY / _dX;
            _dX = -1;
            } else {
            _dX = -1 * _dX / _dY;
            _dY = -1;
            }
            } else if (_dX > 0 && _dY < 0) {
            //_log.warning("Situation B-SW ("+_dX+";"+_dY+")");
            if (_dX > (-1 * _dY)) {
            _dY = -1 * (_dY / _dX);
            _dX = -1;
            } else {
            _dX = _dX / _dY;
            _dY = 1;
            }
            } else if (_dX < 0 && _dY > 0) {
            //_log.warning("Situation C-NE ("+_dX+";"+_dY+")");
            if ((-1 * _dX) > _dY) {
            _dY = _dY / _dX;
            _dX = 1;
            } else {
            _dX = -1 * (_dX / _dY);
            _dY = -1;
            }
            } else if (_dX < 0 && _dY < 0) {
            //_log.warning("Situation D-SE ("+_dX+";"+_dY+")");
            if (_dX > _dY) {
            _dY = _dY / _dX;
            _dX = 1;
            } else {
            _dX = _dX / _dY;
            _dY = 1;
            }
            } else if (_dX == 0 && _dY == 0) {
            //_log.warning("Situation X");
            _dX = -1;
            _dY = -1;
            }
            _deltas.put(getEffected().getObjectId(), new float[]{_dX, _dY});
            getEffected().startFear();
            onActionTime();
            return true;
        }
        return false;
    }
 
    /** Notify exited */
    @@override
    public void onExit() {
        getEffected().stopFear(this);
        getEffected().setTarget(null);
        getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
        _deltas.remove(getEffected().getObjectId());
    }
 
public boolean onActionTime()
{
int posX = getEffected().getX();
int posY = getEffected().getY();
int posZ = getEffected().getZ();
float [] delta = _deltas.get(getEffected().getObjectId());
float _dX = -1;
float _dY = -1;
if(delta!=null) {
_dX = delta[0];
_dY = delta[1];
}
//_log.warning("Start Position on Fear. X: " + posX + "  Y: " + posY);
if (_dX != 0)
posX += _dX * FEAR_RANGE;
if (_dY != 0)
posY += _dY * FEAR_RANGE;
//_log.warning("Next Position on Fear. X: " + posX + "  Y: " + posY);
Location destiny = GeoData.getInstance().moveCheck(getEffected().getX(), getEffected().getY(), getEffected().getZ(), posX, posY, posZ, getEffected().getInstanceId());
if (!(getEffected() instanceof L2PetInstance))
getEffected().setRunning();
getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(destiny.getX(), destiny.getY(), destiny.getZ(), 0));
 
// Give damage if "val" > 0
double damage = calc();
if (damage != 0)
getEffected().reduceCurrentHp(damage, getEffector(), true, true, getSkill());
return true;
}
}
Изменено пользователем chev7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я согласен что не в дп

много-много говнокода

 

какой п...ц

код сообщением выше - не лучше.

 

автор, сомтри как феар реализован в овероподобных сборках, а конкретно расчет движения и пробуй адаптировать под свою сборку

package l2p.gameserver.skills.effects;

import l2p.gameserver.ai.CtrlIntention;
import l2p.gameserver.geodata.GeoEngine;
import l2p.gameserver.model.Effect;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.entity.events.impl.SiegeEvent;
import l2p.gameserver.model.instances.SummonInstance;
import l2p.gameserver.network.serverpackets.components.SystemMsg;
import l2p.gameserver.stats.Env;
import l2p.gameserver.utils.PositionUtils;

public final class EffectFear extends Effect
{
	public static final double FEAR_RANGE = 900;

	public EffectFear(Env env, EffectTemplate template)
	{
		super(env, template);
	}

	@[member='override']
	public boolean checkCondition()
	{
		if (_effected.isOutOfControlImmune())
		{
			getEffector().sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET);
			return false;
		}

		// Fear нельзя наложить на осадных саммонов
		Player player = _effected.getPlayer();

		if (player != null)
		{
			SiegeEvent<?, ?> siegeEvent = player.getEvent(SiegeEvent.class);

			if (_effected.isServitor() && siegeEvent != null && siegeEvent.containsSiegeSummon((SummonInstance) _effected))
			{
				getEffector().sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET);
				return false;
			}
		}

		if (_effected.isInPeaceZone())
		{
			getEffector().sendPacket(SystemMsg.YOU_MAY_NOT_ATTACK_IN_A_PEACEFUL_ZONE);
			return false;
		}

		return super.checkCondition();
	}

	@[member='override']
	public void onStart()
	{
		super.onStart();

		if (!_effected.startFeared())
		{
			if (_effected.isServitor())
				_effected.saveAttackTarget();

			_effected.abortAttack(true, true);
			_effected.abortCast(true, true);
			_effected.stopMove();
		}

		onActionTime();
	}

	@[member='override']
	public void onExit()
	{
		super.onExit();

		_effected.stopFeared();
		_effected.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);

		if (_effected.isServitor())
			_effected.restoreAttackTarget();
	}

	@[member='override']
	public boolean onActionTime()
	{
		final double angle = Math.toRadians(PositionUtils.calculateAngleFrom(_effector, _effected));
		final int oldX = _effected.getX();
		final int oldY = _effected.getY();
		final int x = oldX + (int) (FEAR_RANGE * Math.cos(angle));
		final int y = oldY + (int) (FEAR_RANGE * Math.sin(angle));
		_effected.setRunning();
		_effected.moveToLocation(GeoEngine.moveCheck(oldX, oldY, _effected.getZ(), x, y, _effected.getGeoIndex()), 0, false);
		return true;
	}
}
что представляет собой calculateAngleFrom

	public static double calculateAngleFrom(GameObject obj1, GameObject obj2)
	{
		return calculateAngleFrom(obj1.getX(), obj1.getY(), obj2.getX(), obj2.getY());
	}

	public static double calculateAngleFrom(int obj1X, int obj1Y, int obj2X, int obj2Y)
	{
		double angleTarget = Math.toDegrees(Math.atan2(obj2Y - obj1Y, obj2X - obj1X));

		if (angleTarget < 0)
			angleTarget = 360 + angleTarget;

		return angleTarget;
	}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фикс фира:
L2Character.java
Убираем к чертям собачим
с public boolean isAllSkillsDisabled() и с public boolean isAttackingDisabled()
|| isAfraid()
Профит!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:рукалицо:

 

ты хоть понял что ты посоветовал?

ты посоветовал убрать из проверок на возможность кастовать и атаковать проверку на наличие наложенного фира.

т.е. если нигде более нет доп проверок на эту тему - под наложенным фиром после твоего фикса можно будет кастовать скиллы и т.д.

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...