- Хроники
- Chaotic Throne: High Five
- Исходники
- Присутствуют
- Сборка
- l2j-dev
Такой вопрос, вот есть скилл Тоггле , как можно жделать чтобы при его активации он цеплял с собой еще скилы, баффов например. Чтобы пока он был активен, бафы висели.
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Ну да , принцип тот )Опа астериософаг подьехал
public final Creature getAimingTarget(Creature activeChar, GameObject obj)
{
Creature target = obj == null || !obj.isCreature() ? null : (Creature) obj;
switch(_targetType)
{
...
case TARGET_ONE:
// почему именно getEffectByStackType а не новый эффект/ид/что угодно еще? - банально проще добавить для ленивых. )0)
if (_skillType == SkillType.BUFF && activeChar.getPlayer().getParty() != null && activeChar.getPlayer().getEffectList().getEffectByStackType("mass_buff") != null)
return activeChar;
return target != null && target.isDead() == _isCorpse && !(target == activeChar && isOffensive()) && (!_isUndeadOnly || target.isUndead()) ? target : null;
...
public List<Creature> getTargets(Creature activeChar, Creature aimingTarget, boolean forceUse)
{
List<Creature> targets;
if(oneTarget()) {
Player player = activeChar.getPlayer();
//нахера тут трехэтажные проверки?
if (_targetType == SkillTargetType.TARGET_ONE && player != null && _skillType == SkillType.BUFF)
{
//ну, так надо
if (player.getEffectList().getEffectByStackType("mass_buff") != null && player.getParty() != null)
{
//собственно, почти копи-паст с блока !oneTarget()
targets = new LazyArrayList<Creature>();
//вот тут только не скилл радиус, а каст ренж беру (может разделить вдвое? хз, сами думайте) чтобы датапак не пилить, ибо у бафов скилл радиус 40 будет. )
for(Player target : World.getAroundPlayers(player, _castRange, _castRange))
{
// вырезал за ненадобностью блок для isMonster() || isSiegeGuard()
if(!(player.getParty() == target.getParty()))
continue;
if(player.isInOlympiadMode() && target.isInOlympiadMode() && player.getOlympiadSide() != target.getOlympiadSide())
continue;
if(checkTarget(player, target, aimingTarget, forceUse, false) != null)
continue;
addTargetAndPetToList(targets, player, target);
}
addTargetAndPetToList(targets, player, player);
return targets;
}
}
// ну и для остальных случаев оставляем как было
targets = new LazyArrayList<Creature>(1);
targets.add(aimingTarget);
return targets;
}
...
Если ему как на астере нужно, то можно сделать чек на тогл скил, если тогл вкл то подменять тип таргета у скилов которые имеют параметр бафф на пати к примеруАдекватно я не тестил, и явно что-то упустил, буду рад замечаниям. )
~\gameserver\model\Skill.javaЭто не под l2j-dev писалось, но под овероподобное должно подойти, я думаю.
допилим getAimingTarget:
Java:public final Creature getAimingTarget(Creature activeChar, GameObject obj) { Creature target = obj == null || !obj.isCreature() ? null : (Creature) obj; switch(_targetType) { ... case TARGET_ONE: // почему именно getEffectByStackType а не новый эффект/ид/что угодно еще? - банально проще добавить для ленивых. )0) if (_skillType == SkillType.BUFF && activeChar.getPlayer().getParty() != null && activeChar.getPlayer().getEffectList().getEffectByStackType("mass_buff") != null) return activeChar; return target != null && target.isDead() == _isCorpse && !(target == activeChar && isOffensive()) && (!_isUndeadOnly || target.isUndead()) ? target : null; ...
теперь getTargets (вот тут будет больно глазам, конечно, но писать нормально недостойное викинга занятие):
Java:public List<Creature> getTargets(Creature activeChar, Creature aimingTarget, boolean forceUse) { List<Creature> targets; if(oneTarget()) { Player player = activeChar.getPlayer(); //нахера тут трехэтажные проверки? if (_targetType == SkillTargetType.TARGET_ONE && player != null && _skillType == SkillType.BUFF) { //ну, так надо if (player.getEffectList().getEffectByStackType("mass_buff") != null && player.getParty() != null) { //собственно, почти копи-паст с блока !oneTarget() targets = new LazyArrayList<Creature>(); //вот тут только не скилл радиус, а каст ренж беру (может разделить вдвое? хз, сами думайте) чтобы датапак не пилить, ибо у бафов скилл радиус 40 будет. ) for(Player target : World.getAroundPlayers(player, _castRange, _castRange)) { // вырезал за ненадобностью блок для isMonster() || isSiegeGuard() if(!(player.getParty() == target.getParty())) continue; if(player.isInOlympiadMode() && target.isInOlympiadMode() && player.getOlympiadSide() != target.getOlympiadSide()) continue; if(checkTarget(player, target, aimingTarget, forceUse, false) != null) continue; addTargetAndPetToList(targets, player, target); } addTargetAndPetToList(targets, player, player); return targets; } } // ну и для остальных случаев оставляем как было targets = new LazyArrayList<Creature>(1); targets.add(aimingTarget); return targets; } ...
Та ауры сложнее, там еще листнер на снятие эффекта нужно, если сопартиец отбежал фиг пойми куда. )Это механика скиллов-аур, у нас, кстати, реализована
Ну ведь так и нужно делать, иначе можно наабузить окнами сколько угодно аур, если их сделать несколько видовТа ауры сложнее, там еще листнер на снятие эффекта нужно, если сопартиец отбежал фиг пойми куда. )
Несомненно! ) Я просто говорю что у ТСа запрос более скромный, ему нужно просто по тоглу менять тип таргета активных бафов с одиночной цели, на пати (из пп сделать мод варка), а что дальше будет с бафами его не интересует и отслеживать кто куда отбежал не нужно. Упомянутая Вами механика всяко более интересная, но под другие задачи и хроники. )Ну ведь так и нужно делать, иначе можно наабузить окнами сколько угодно аур, если их сделать несколько видов
а, да, я невнимательно прочитал дополнительный коммент от автораНесомненно! ) Я просто говорю что у ТСа запрос более скромный, ему нужно просто по тоглу менять тип таргета активных бафов с одиночной цели, на пати (из пп сделать мод варка), а что дальше будет с бафами его не интересует и отслеживать кто куда отбежал не нужно. Упомянутая Вами механика всяко более интересная, но под другие задачи и хроники. )