Auto Sweepe и Festive sweeper - Как сделать/ починить?

BladeRunner

Свой человек
Меценат
Сообщения
1 321
Розыгрыши
0
Репутация
-269
Реакции
491
Баллы
525
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
Acis 401
Все забивают на гномиков, особенной корейцы)) Так что пытаюсь облегчить им жизнь ))
1. Подскажите пожалуйста, как реализовать авто-свип по аналогии с авто-лутом?
2. И второй вопрос - нашел на форуме, как поправить не работающий массовый свип на сборке люцеры1.7, но для Акисов этот не сработало... что и где надо еще править? вот тема с фиксом для люцеры - Festive Sweeper
 
1. Подскажите пожалуйста, как реализовать авто-свип по аналогии с авто-лутом?
ну ищем где у нас происходит распределение дропа и там где-то делать проверку на isSweep(by killer) и на наличие руны (автоспойла или конфиг просто вписать). Далее снимать свип и выдавать предметы из группы SPOIL.
2. И второй вопрос - нашел на форуме, как поправить не работающий массовый свип на сборке люцеры1.7, но для Акисов этот не сработало... что и где надо еще править? вот тема с фиксом для люцеры - Festive Sweeper
ну я бы наверное запустил сборку в дебаг режиме и начал смотреть в классе монстра метод, который присваивает ему sweep статус.
Дальше посмотреть где именно идет сам обработчик умения и как-то бы сделал чтоб он на несколько целей действовал, если там стоит условие что только на цель.
 
@BladeRunner, На сколько я знаю, Festive Sweeper отлично работает у aCis (на той версии которая у меня есть, работает).
 
ну ищем где у нас происходит распределение дропа и там где-то делать проверку на isSweep(by killer) и на наличие руны (автоспойла или конфиг просто вписать). Далее снимать свип и выдавать предметы из группы SPOIL.

а какое условие идет, если по максимальному нанесенному дпс? по сути же если несколько разных человек убивают моба - то дроп некоторое время доступен только тому, кто нанес больший дпс. Руны автоспойла нет. идея сделать автосвип просто настройкой сервера, как автолут. тут еще нужна проверка, что убийца моба может быть один игрок. а спойлер - другой и не в пати
ну я бы наверное запустил сборку в дебаг режиме и начал смотреть в классе монстра метод, который присваивает ему sweep статус.
Дальше посмотреть где именно идет сам обработчик умения и как-то бы сделал чтоб он на несколько целей действовал, если там стоит условие что только на цель.

сам свип статус есть, мобы в парике светятся синим. у акиса не проходит именно параметр AREA_CORPSE_MOB, и срабатывает просто как CORPSE_MOB

@BladeRunner, На сколько я знаю, Festive Sweeper отлично работает у aCis (на той версии которая у меня есть, работает).
ну значит в 401 последней паблик версии они его сломали. а у тебя какая версия акисов? более того, они даже не выдают спойлерам этот скил. приходится вручную добавлять через ГМ панель для тестов.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
сам свип статус есть, мобы в парике светятся синим. у акиса не проходит именно параметр AREA_CORPSE_MOB, и срабатывает просто как CORPSE_MOB

А если так?

JavaScript:
<skill id="444" levels="1" name="Festive Sweeper">
        <set name="reuseDelay" val="12000" />
        <set name="magicLevel" val="28" />
        <set name="hitTime" val="500" />
        <set name="hitCancelTime" val="500" />
        <set name="mpConsume2" val="12" />
        <set name="target" val="TARGET_AURA" />
        <set name="corpse" val="true" />
        <set name="skillRadius" val="350" />
        <set name="skillType" val="SWEEP" />
        <set name="operateType" val="OP_ACTIVE" />
    </skill>

Все забивают на гномиков, особенной корейцы)) Так что пытаюсь облегчить им жизнь ))
1. Подскажите пожалуйста, как реализовать авто-свип по аналогии с авто-лутом?
2. И второй вопрос - нашел на форуме, как поправить не работающий массовый свип на сборке люцеры1.7, но для Акисов этот не сработало... что и где надо еще править? вот тема с фиксом для люцеры - Festive Sweeper

не проще просто весь спойл в дроп перевести?)

Чтобы всё что спойлилось теперь просто дропалось с теми же шансами и тд.
 
ну значит в 401 последней паблик версии они его сломали. а у тебя какая версия акисов? более того, они даже не выдают спойлерам этот скил. приходится вручную добавлять через ГМ панель для тестов.
у меня 406, конечно не выдают, скилл кастомный его в ИТ не было.
 
А если так?

JavaScript:
<skill id="444" levels="1" name="Festive Sweeper">
        <set name="reuseDelay" val="12000" />
        <set name="magicLevel" val="28" />
        <set name="hitTime" val="500" />
        <set name="hitCancelTime" val="500" />
        <set name="mpConsume2" val="12" />
        <set name="target" val="TARGET_AURA" />
        <set name="corpse" val="true" />
        <set name="skillRadius" val="350" />
        <set name="skillType" val="SWEEP" />
        <set name="operateType" val="OP_ACTIVE" />
    </skill>

не взлетело ((( выдало ошибку :
JavaScript:
Error loading file .\data\xml\skills\0400-0499.xml
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at net.sf.l2j.gameserver.enums.skills.SkillType.makeSkill(SkillType.java:156)
        at net.sf.l2j.gameserver.data.DocumentSkill.makeSkills(DocumentSkill.java:335)
        at net.sf.l2j.gameserver.data.DocumentSkill.parseSkill(DocumentSkill.java:206)
        at net.sf.l2j.gameserver.data.DocumentSkill.parseDocument(DocumentSkill.java:96)
        at net.sf.l2j.gameserver.data.DocumentBase.parse(DocumentBase.java:88)
        at net.sf.l2j.gameserver.data.DocumentSkill.parse(DocumentSkill.java:18)
        at net.sf.l2j.gameserver.data.SkillTable.load(SkillTable.java:60)
        at net.sf.l2j.gameserver.data.SkillTable.<init>(SkillTable.java:50)
        at net.sf.l2j.gameserver.data.SkillTable$SingletonHolder.<clinit>(SkillTable.java:264)
        at net.sf.l2j.gameserver.data.SkillTable.getInstance(SkillTable.java:45)
        at net.sf.l2j.gameserver.GameServer.<init>(GameServer.java:156)
        at net.sf.l2j.gameserver.GameServer.main(GameServer.java:115)
Caused by: java.lang.reflect.InvocationTargetException
        at jdk.internal.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at net.sf.l2j.gameserver.enums.skills.SkillType.makeSkill(SkillType.java:152)
        ... 11 more
Caused by: java.lang.IllegalArgumentException: No enum constant net.sf.l2j.gameserver.enums.skills.SkillOpType.OP_ACTIVE
        at java.base/java.lang.Enum.valueOf(Enum.java:240)
        at net.sf.l2j.commons.data.StatSet.getEnum(StatSet.java:502)
        at net.sf.l2j.gameserver.skills.L2Skill.<init>(L2Skill.java:191)
        at net.sf.l2j.gameserver.skills.l2skills.L2SkillDefault.<init>(L2SkillDefault.java:14)
        ... 15 more
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
не взлетело ((( выдало ошибку :
JavaScript:
Error loading file .\data\xml\skills\0400-0499.xml
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at net.sf.l2j.gameserver.enums.skills.SkillType.makeSkill(SkillType.java:156)
        at net.sf.l2j.gameserver.data.DocumentSkill.makeSkills(DocumentSkill.java:335)
        at net.sf.l2j.gameserver.data.DocumentSkill.parseSkill(DocumentSkill.java:206)
        at net.sf.l2j.gameserver.data.DocumentSkill.parseDocument(DocumentSkill.java:96)
        at net.sf.l2j.gameserver.data.DocumentBase.parse(DocumentBase.java:88)
        at net.sf.l2j.gameserver.data.DocumentSkill.parse(DocumentSkill.java:18)
        at net.sf.l2j.gameserver.data.SkillTable.load(SkillTable.java:60)
        at net.sf.l2j.gameserver.data.SkillTable.<init>(SkillTable.java:50)
        at net.sf.l2j.gameserver.data.SkillTable$SingletonHolder.<clinit>(SkillTable.java:264)
        at net.sf.l2j.gameserver.data.SkillTable.getInstance(SkillTable.java:45)
        at net.sf.l2j.gameserver.GameServer.<init>(GameServer.java:156)
        at net.sf.l2j.gameserver.GameServer.main(GameServer.java:115)
Caused by: java.lang.reflect.InvocationTargetException
        at jdk.internal.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at net.sf.l2j.gameserver.enums.skills.SkillType.makeSkill(SkillType.java:152)
        ... 11 more
Caused by: java.lang.IllegalArgumentException: No enum constant net.sf.l2j.gameserver.enums.skills.SkillOpType.OP_ACTIVE
        at java.base/java.lang.Enum.valueOf(Enum.java:240)
        at net.sf.l2j.commons.data.StatSet.getEnum(StatSet.java:502)
        at net.sf.l2j.gameserver.skills.L2Skill.<init>(L2Skill.java:191)
        at net.sf.l2j.gameserver.skills.l2skills.L2SkillDefault.<init>(L2SkillDefault.java:14)
        ... 15 more


Скинь сюда как у тебя выглядит скилл Corpse Burst id=1155

Похоже там другая логика скиллов для трупа
 
экспериментальным методом было выяснено, что "AREA_CORPSE_MOB" работает не на трупы, а агрит живых мобов в округе, при этом правильно срабатывая только на труп в таргете. хотя должно срабатывать на трупы. где в исходниках искать этот код?)))
по аналогу с масс-ресом тоже сделать не получается, там параметр корпс_алли.

Скинь сюда как у тебя выглядит скилл Corpse Burst id=1155

Похоже там другая логика скиллов для трупа

очень странно работает этот параметр эрея_корпс_моб. Один труп из кучи он выделяет, тот что в таргете, и его свипает. а остальных всех мобов вокруг живых - агрит. Прикольно, когда поставил рейнж 4000, и вся локация мобов бежит на тебя со всех сторон) прям зомби- апокалипсис)


Код:
<skill id="1155" levels="15" name="Corpse Burst" enchantLevels1="30" enchantLevels2="30" >
        <table name="#enchantMagicLvl"> 76 76 76 77 77 77 78 78 78 79 79 79 80 80 80 81 81 81 82 82 82 82 83 83 83 84 84 85 85 85 </table>
        <table name="#ench2MpConsume"> 54 53 52 51 51 50 49 48 48 47 46 45 44 44 43 42 41 41 40 39 38 38 37 36 35 34 34 33 32 31 </table>
        <table name="#ench2MpConsume_Init"> 13 13 13 12 12 12 12 12 12 11 11 11 11 11 10 10 10 10 10 9 9 9 9 9 8 8 8 8 8 7 </table>
        <table name="#ench1Power"> 109 109 110 111 111 112 113 113 114 115 115 116 116 117 118 118 119 120 120 121 122 122 123 124 124 125 125 126 127 127 </table>
        <table name="#mpInitialConsume"> 9 9 9 10 10 11 11 11 12 12 13 13 13 14 14 </table>
        <table name="#mpConsume"> 33 35 36 38 39 41 43 44 46 48 49 51 52 53 55 </table>
        <table name="#magicLvl"> 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 </table>
        <table name="#power"> 61 65 68 72 75 78 82 85 89 92 96 99 102 105 108 </table>
        <set name="mpInitialConsume" val="#mpInitialConsume"/>
        <set name="mpConsume" val="#mpConsume"/>
        <set name="magicLvl" val="#magicLvl"/>
        <set name="power" val="#power"/>
        <set name="target" val="AREA_CORPSE_MOB"/>
        <set name="skillRadius" val="200"/>
        <set name="reuseDelay" val="20000"/>
        <set name="hitTime" val="1500"/>
        <set name="skillType" val="MDAM"/>
        <set name="isMagic" val="true"/>
        <set name="operateType" val="ACTIVE"/>
        <set name="castRange" val="400"/>
        <set name="effectRange" val="900"/>
        <enchant1 name="power" val="#ench1Power"/>
        <enchant1 name="magicLvl" val="#enchantMagicLvl"/>
        <enchant2 name="magicLvl" val="#enchantMagicLvl"/>        
        <enchant2 name="mpConsume" val="#ench2MpConsume"/>
        <enchant2 name="mpInitialConsume" val="#ench2MpConsume_Init"/>
    </skill>
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
агрит живых мобов в округе
<set name="effectRange" val="900"/>

Могу ошибаться но за это отвечает вот этот параметр)

Относительно Corpse Burst

<set name="skillType" val="MDAM"/>
Поменяй на SWEEP

Может таким образом получится
 
Оверпостинг запрещен!
<set name="effectRange" val="900"/>

Могу ошибаться но за это отвечает вот этот параметр)

Относительно Corpse Burst

<set name="skillType" val="MDAM"/>
Поменяй на SWEEP

Может таким образом получится
да, именно для этого скила это и сделано. то есть Эреа_корпс_моб как раз и дает скилтайп по окружающим живым. а надо еще один параметр , который будет давать то что в скилтайпе по мертвым мобам вокруг мертвого таргета.

в общем в исходниках надо вводить еще один параметр.
вот параметр, который бьет по живым целям вокруг мертвой - area_corpse_mob, код ниже
а надо еще один, который бьет по мертвым вокруг мертвой цели - corpse_area_corpse_mob
Код:
package net.sf.l2j.gameserver.handler.targethandlers;

import java.util.ArrayList;
import java.util.List;

import net.sf.l2j.gameserver.enums.skills.SkillTargetType;
import net.sf.l2j.gameserver.geoengine.GeoEngine;
import net.sf.l2j.gameserver.handler.ITargetHandler;
import net.sf.l2j.gameserver.model.actor.Attackable;
import net.sf.l2j.gameserver.model.actor.Creature;
import net.sf.l2j.gameserver.model.actor.Playable;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.skills.L2Skill;

public class TargetAreaCorpseMob implements ITargetHandler
{
    @Override
    public SkillTargetType getTargetType()
    {
        return SkillTargetType.AREA_CORPSE_MOB;
    }
   
    @Override
    public Creature[] getTargetList(Creature caster, Creature target, L2Skill skill)
    {
        final List<Creature> list = new ArrayList<>();
        list.add(target);
       
        for (Creature creature : target.getKnownTypeInRadius(Creature.class, skill.getSkillRadius()))
        {
            if (creature == caster || creature.isDead() || !GeoEngine.getInstance().canSeeTarget(target, creature))
                continue;
           
            if (caster instanceof Playable && (creature instanceof Attackable || creature instanceof Playable))
            {
                if (creature.isAttackableWithoutForceBy((Playable) caster))
                    list.add(creature);
            }
            else if (caster instanceof Attackable && creature instanceof Playable)
            {
                if (creature.isAttackableBy(caster))
                    list.add(creature);
            }
        }
       
        return list.toArray(new Creature[list.size()]);
    }
   
    @Override
    public Creature getFinalTarget(Creature caster, Creature target, L2Skill skill)
    {
        return target;
    }
   
    @Override
    public boolean meetCastConditions(Playable caster, Creature target, L2Skill skill, boolean isCtrlPressed)
    {
        if ((!(target instanceof Attackable)) || !target.isDead())
        {
            caster.sendPacket(SystemMessageId.INVALID_TARGET);
            return false;
        }
        return true;
    }
}

<set name="effectRange" val="900"/>

Могу ошибаться но за это отвечает вот этот параметр)

Относительно Corpse Burst

<set name="skillType" val="MDAM"/>
Поменяй на SWEEP

Может таким образом получится
нет, эффект рейнж - это расстояние от игрока, на котором еще действует скил во время каста. если цель убежит - каст сорвется. или если это АОЕ скилл, то на цели, которые находятся вокруг цели в радиусе скиллрейнж, но дальше эффект рейнж - скилл не пройдет.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
да, именно для этого скила это и сделано. то есть Эреа_корпс_моб как раз и дает скилтайп по окружающим живым. а надо еще один параметр , который будет давать то что в скилтайпе по мертвым мобам вокруг мертвого таргета.

Ага, попутал с effectPoint вот этот параметр агр добавляет.
 
нет, эффект рейнж - это расстояние от игрока, на котором еще действует скил во время каста. если цель убежит - каст сорвется. или если это АОЕ скилл, то на цели, которые находятся вокруг цели в радиусе скиллрейнж, но дальше эффект рейнж - скилл не пройдет.
This is correct - effectRange and affectRange are very easy to confuse.
effectRange comes from the OFF parameter "effective_range", which is the one BladeRunner explained (if the target walks away more than this range, the skill casting will be interrupted).
affectRange is the actual parameter which specifies the AoE of a skill with area effects.
 
Итоговое решение:
1. в Монстер.джава вписываем dropOrAutoLootItem(player, holder, true) в методе спойла, вместо getSpoilState().add(holder).
2. решения не нашел, в 401 ревизии акиса неверно задан класс AREA_CORPSE_MOB , он задает окружность вокруг трупа по живым целям, а не по тоже мертвым. как поправить - пока не знаю.
 
Последнее редактирование:
Назад
Сверху Снизу