Сообщений: 57
Тем: 12
Зарегистрирован: Mar 2012
Репутация:
6
Здравствуйте.
Сборка l2p 20856
Подскажите, пожалуйста, где находится ЗАПРЕТ на атаку НЕ флагнутого чара DEBUFFом. К сожалению, не могу найти. Хватит информации в каком классе находится.
Спасибо!
Сообщений: 2,444
Тем: 59
Зарегистрирован: May 2010
Репутация:
13,020
Сформулируйте правильно вопрос
СЕО Оптимизация сайтов
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
Смотрите класс l2p.gameserver.model.L2Skill метод l2p.gameserver.model.L2Skill.checkCondition(L2Character, L2Character, boolean, boolean, boolean, boolean)
хотя не исключено что где то ещё доп. проверки есть
Сообщений: 57
Тем: 12
Зарегистрирован: Mar 2012
Репутация:
6
01-03-2013, 12:33 PM
(Сообщение последний раз редактировалось: 01-03-2013, 12:40 PM Virt.)
gorodetskiy Написал:Сформулируйте правильно вопрос skilltype='DEBUFF' - xml
ядро:
if(!target.isPvPFlag && skilltype.deBuff)
return false;
Ищу что-то в этом роде.
Словами - хочу использовать дебафф на нефлагнутого чара. Но не могу найти этот запрет.
Добавлено через 3 минуты
bloodshed Написал:Смотрите класс l2p.gameserver.model.L2Skill метод l2p.gameserver.model.L2Skill.checkCondition(L2Character, L2Character, boolean, boolean, boolean, boolean)
хотя не исключено что где то ещё доп. проверки есть
Спасибо. К сожалнию, чуть-чуть не то. Там типы эффектов. А нужно типы скилов skilltype = debuff
Добавлено через 6 минут
Постараюсь пояснить чуть-чуть подробнее: мы не можем наложить на чара отрицательный эффект, до тех пор пока чар не будет флагнут\дуэль с чаром\ пвп зона
Интересует, где данный запрет находится=)
Спасибо.
Сообщений: 1,053
Тем: 33
Зарегистрирован: Sep 2011
Репутация:
12,172
Метод doCast в gameserver.model.Playable.java
PHP код: <?php
if(skill.getSkillType() == SkillType.DEBUFF && target.isNpc() && !target.isMonster() && !target.isInCombat() && target.getPvpFlag() == 0)
{
getPlayer().sendPacket(Msg.INVALID_TARGET);
return;
}
Сообщений: 57
Тем: 12
Зарегистрирован: Mar 2012
Репутация:
6
L2CCCP Написал:Метод doCast в gameserver.model.Playable.java
PHP код: <?php
if(skill.getSkillType() == SkillType.DEBUFF && target.isNpc() && !target.isMonster() && !target.isInCombat() && target.getPvpFlag() == 0)
{
getPlayer().sendPacket(Msg.INVALID_TARGET);
return;
}
Если бы все так легко и наглядно было =)) Но, к сожалению, не то=)
Вот метод DoCast
doCast
PHP код: <?php
public void doCast(L2Skill skill, L2Character target, boolean forceUse)
{
// Прерывать дуэли если цель не дуэлянт
if(getDuel() != null)
if(target.getDuel() != getDuel())
getDuel().setDuelState(getPlayer().getStoredId(), DuelState.Interrupted);
else if(isPlayer() && getDuel().getDuelState(getStoredId()) == DuelState.Interrupted)
{
sendPacket(Msg.INVALID_TARGET);
return;
}
if(skill == null)
{
sendActionFailed();
return;
}
GArray<L2Character> targets = skill.getTargets(this, target, forceUse);
if (this instanceof L2Player)
{
if (EventHandler.getInstance().useSkill(getPlayer(), target, skill))
{
for (L2Character target1 : targets)
if (!EventHandler.getInstance().useSkill(getPlayer(), target1, skill))
targets.remove(target1);
}
else return;
}
int itemConsume[] = skill.getItemConsume();
if(itemConsume[0] > 0)
for(int i = 0; i < itemConsume.length; i++)
if(!consumeItem(skill.getItemConsumeId()[i], itemConsume[i]))
{
sendPacket(Msg.INCORRECT_ITEM_COUNT);
sendChanges();
return;
}
int magicId = skill.getId();
if(target == null)
target = skill.getAimingTarget(this, getTarget());
if(target == null)
return;
fireMethodInvoked(MethodCollection.onStartCast, new Object[] { skill, target, forceUse });
setHeading(target, true);
int level = Math.max(1, getSkillDisplayLevel(magicId));
int skillTime = skill.isSkillTimePermanent() ? skill.getHitTime() : Formulas.calcMAtkSpd(this, skill, skill.getHitTime());
int skillInterruptTime = skill.isMagic() ? Formulas.calcMAtkSpd(this, skill, skill.getSkillInterruptTime()) : 0;
int minCastTime = Math.min(Config.SKILLS_CAST_TIME_MIN, skill.getHitTime());
if(skillTime < minCastTime)
{
skillTime = minCastTime;
skillInterruptTime = 0;
}
_animationEndTime = System.currentTimeMillis() + skillTime;
if(skill.isMagic() && !skill.isSkillTimePermanent() && getChargedSpiritShot() > 0)
{
skillTime = (int) (0.70 * skillTime);
skillInterruptTime = (int) (0.70 * skillInterruptTime);
}
Formulas.calcSkillMastery(skill, this); // Calculate skill mastery for current cast
long reuseDelay = Math.max(500, Formulas.calcSkillReuseDelay(this, skill));
broadcastPacket(new MagicSkillUse(this, target, skill.getDisplayId(), level, skillTime, reuseDelay));
disableItem(skill, reuseDelay, reuseDelay);
disableSkill(skill.getId(), reuseDelay);
if(isPlayer())
if(!skill.isHandler())
sendPacket(new SystemMessage(SystemMessage.YOU_USE_S1).addSkillName(magicId, level));
else
sendPacket(new SystemMessage(SystemMessage.YOU_USE_S1).addItemName(skill.getItemConsumeId()[0]));
if(skill.getTargetType() == SkillTargetType.TARGET_HOLY)
target.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, this, 1);
double mpConsume1 = skill.isUsingWhileCasting() ? skill.getMpConsume() : skill.getMpConsume1();
if(mpConsume1 > 0)
if(skill.isMusic())
{
double inc = mpConsume1 / 2;
double add = 0;
for(L2Effect e : getEffectList().getAllEffects())
if(e.getSkill().getId() != skill.getId() && e.getSkill().isMusic() && e.getTimeLeft() > 30000)
add += inc;
mpConsume1 += add;
mpConsume1 = calcStat(Stats.MP_DANCE_SKILL_CONSUME, mpConsume1, target, skill);
}
else if(skill.isMagic())
reduceCurrentMp(calcStat(Stats.MP_MAGIC_SKILL_CONSUME, mpConsume1, target, skill), null);
else
reduceCurrentMp(calcStat(Stats.MP_PHYSICAL_SKILL_CONSUME, mpConsume1, target, skill), null);
_flyLoc = null;
if(skill.getFlyType() == FlyType.DUMMY || skill.getFlyType() == FlyType.CHARGE)
{
Location flyLoc = getFlyLocation(target, skill);
if(flyLoc != null)
{
_flyLoc = flyLoc;
broadcastPacket(new FlyToLocation(this, flyLoc, skill.getFlyType()));
}
else
{
sendPacket(Msg.CANNOT_SEE_TARGET);
return;
}
}
_castingSkill = skill;
_castInterruptTime = System.currentTimeMillis() + skillInterruptTime;
setCastingTarget(target);
if(skill.isUsingWhileCasting())
callSkill(skill, targets, true);
if(isPlayer())
sendPacket(new SetupGauge(SetupGauge.BLUE, skillTime));
_scheduledCastCount = skill.getCastCount();
_scheduledCastInterval = skill.getCastCount() > 0 ? skillTime / _scheduledCastCount : skillTime;
// Create a task MagicUseTask with Medium priority to launch the MagicSkill at the end of the casting time
_skillLaunchedTask = ThreadPoolManager.getInstance().scheduleAi(new MagicLaunchedTask(this, forceUse), skillInterruptTime, isPlayable());
_skillTask = ThreadPoolManager.getInstance().scheduleAi(new MagicUseTask(this, forceUse), skill.getCastCount() > 0 ? skillTime / skill.getCastCount() : skillTime, isPlayable());
}
Сообщений: 1,053
Тем: 33
Зарегистрирован: Sep 2011
Репутация:
12,172
ТС открой все скрипты в ноутпаде++ и ищи по строке skill.getSkillType() == SkillType.DEBUFF
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
Сначала у вас должен пройти сам скил, потом идёт применение эффектов.
1 - в методе l2p.gameserver.model.L2Skill.checkCondition(L2Char acter, L2Character, boolean, boolean, boolean, boolean) вызывается метод l2p.gameserver.model.L2Skill.checkTarget(L2Character, L2Character, L2Character, boolean, boolean) в котором есть строки:
[src=java]
public final SystemMessage checkTarget(final L2Character activeChar, final L2Character target, final L2Character aimingTarget, final boolean forceUse, final boolean first)
{
......................
final L2Player player = activeChar.getPlayer();
if(player != null)
{
........................
final L2Player pcTarget = target.getPlayer();
if(pcTarget != null)
{
............................
if(isOffensive())
{
...........................
if(pcTarget.getPvpFlag() != 0)
return null;
...........................
return Msg.INCORRECT_TARGET;
[/src]
if(isOffensive()) - смотрите как у вас это определяется.
Сообщений: 57
Тем: 12
Зарегистрирован: Mar 2012
Репутация:
6
Тьфу - ёпрст, слепой вообще. Спасибо.
|