Sky03611 35 Опубликовано 10 января, 2016 (изменено) Суть такая. Сборка 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> Изменено 10 января, 2016 пользователем Sky03611 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BlackDream 321 Опубликовано 10 января, 2016 как минимум скажу , не в дп дело .... Пусть меня исправят, если я не прав! 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Sky03611 35 Опубликовано 10 января, 2016 (изменено) Исходники присутствуют же. Я согласен что не в дп /* * 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; } } Изменено 10 января, 2016 пользователем Sky03611 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ncsSpawN 45 Опубликовано 10 января, 2016 как минимум скажу , не в дп дело .... Пусть меня исправят, если я не прав! Да вы правы дело не в дп. Советую ТС'у самостоятельно поискать а не просить помощи, это вам только пойдет на пользу так как работы на ит.су хватает. Копайте в сторону Paralize. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Sky03611 35 Опубликовано 10 января, 2016 Да вы правы дело не в дп. Советую ТС'у самостоятельно поискать а не просить помощи, это вам только пойдет на пользу так как работы на ит.су хватает. Копайте в сторону Paralize. cпасибо за совет, буду пробовать. Если еще есть кто нибудь с советом я буду только рад Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Sky03611 35 Опубликовано 10 января, 2016 UP. Ahtharas terror чуть чуть срабатывает, перс делает 2 шага и останавливается. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
chev7 5 Опубликовано 13 февраля, 2017 (изменено) /* * 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()); } @@override 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; } } Изменено 13 февраля, 2017 пользователем chev7 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 14 февраля, 2017 Я согласен что не в дп много-много говнокода какой п...цкод сообщением выше - не лучше. автор, сомтри как феар реализован в овероподобных сборках, а конкретно расчет движения и пробуй адаптировать под свою сборку 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; } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
drakola 10 Опубликовано 14 февраля, 2017 Фикс фира: L2Character.java Убираем к чертям собачим с public boolean isAllSkillsDisabled() и с public boolean isAttackingDisabled() || isAfraid() Профит! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 15 февраля, 2017 (изменено) :рукалицо: ты хоть понял что ты посоветовал? ты посоветовал убрать из проверок на возможность кастовать и атаковать проверку на наличие наложенного фира. т.е. если нигде более нет доп проверок на эту тему - под наложенным фиром после твоего фикса можно будет кастовать скиллы и т.д. Изменено 15 февраля, 2017 пользователем Gaikotsu 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты