ну ищем где у нас происходит распределение дропа и там где-то делать проверку на isSweep(by killer) и на наличие руны (автоспойла или конфиг просто вписать). Далее снимать свип и выдавать предметы из группы SPOIL.1. Подскажите пожалуйста, как реализовать авто-свип по аналогии с авто-лутом?
ну я бы наверное запустил сборку в дебаг режиме и начал смотреть в классе монстра метод, который присваивает ему sweep статус.2. И второй вопрос - нашел на форуме, как поправить не работающий массовый свип на сборке люцеры1.7, но для Акисов этот не сработало... что и где надо еще править? вот тема с фиксом для люцеры - Festive Sweeper
ну ищем где у нас происходит распределение дропа и там где-то делать проверку на isSweep(by killer) и на наличие руны (автоспойла или конфиг просто вписать). Далее снимать свип и выдавать предметы из группы SPOIL.
ну я бы наверное запустил сборку в дебаг режиме и начал смотреть в классе монстра метод, который присваивает ему sweep статус.
Дальше посмотреть где именно идет сам обработчик умения и как-то бы сделал чтоб он на несколько целей действовал, если там стоит условие что только на цель.
ну значит в 401 последней паблик версии они его сломали. а у тебя какая версия акисов? более того, они даже не выдают спойлерам этот скил. приходится вручную добавлять через ГМ панель для тестов.BladeRunner, На сколько я знаю, Festive Sweeper отлично работает у aCis (на той версии которая у меня есть, работает).
сам свип статус есть, мобы в парике светятся синим. у акиса не проходит именно параметр AREA_CORPSE_MOB, и срабатывает просто как CORPSE_MOB
<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
у меня 406, конечно не выдают, скилл кастомный его в ИТ не было.ну значит в 401 последней паблик версии они его сломали. а у тебя какая версия акисов? более того, они даже не выдают спойлерам этот скил. приходится вручную добавлять через ГМ панель для тестов.
А если так?
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>
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
Похоже там другая логика скиллов для трупа
<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"/>агрит живых мобов в округе
да, именно для этого скила это и сделано. то есть Эреа_корпс_моб как раз и дает скилтайп по окружающим живым. а надо еще один параметр , который будет давать то что в скилтайпе по мертвым мобам вокруг мертвого таргета.<set name="effectRange" val="900"/>
Могу ошибаться но за это отвечает вот этот параметр)
Относительно Corpse Burst
<set name="skillType" val="MDAM"/>
Поменяй на SWEEP
Может таким образом получится
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
Может таким образом получится
да, именно для этого скила это и сделано. то есть Эреа_корпс_моб как раз и дает скилтайп по окружающим живым. а надо еще один параметр , который будет давать то что в скилтайпе по мертвым мобам вокруг мертвого таргета.
This is correct - effectRange and affectRange are very easy to confuse.нет, эффект рейнж - это расстояние от игрока, на котором еще действует скил во время каста. если цель убежит - каст сорвется. или если это АОЕ скилл, то на цели, которые находятся вокруг цели в радиусе скиллрейнж, но дальше эффект рейнж - скилл не пройдет.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?