Кастомное расширение (скрипт)

xsanard

Vassal
Привет!
Может кто-то подскажет, вчера отчаялся писать расширение, которое должно выставлять для NPC параметр FollowTarget, соответственно, заставлять NPC двигаться к персонажу, призвавшему его.
Пытаюсь реализовать агатиона...

Java:
package Simple;

import l2.gameserver.listener.actor.OnMagicUseListener;
import l2.gameserver.listener.actor.npc.OnSpawnListener;
import l2.gameserver.model.Creature;
import l2.gameserver.model.Skill;
import l2.gameserver.model.actor.listener.NpcListenerList;
import l2.gameserver.model.actor.listener.PlayerListenerList;
import l2.gameserver.model.instances.NpcInstance;
import l2.gameserver.scripts.ScriptFile;

public class SimpleCode implements ScriptFile {
    @Override
    public void onLoad() {
        PlayerListenerList.addGlobal(new OnMagicUseListener() {
            @Override
            public void onMagicUse(Creature creature, Skill skill, Creature creature1, boolean b) {
                if(skill.getId() == 100000) {
                    NpcListenerList.addGlobal(new OnSpawnListener() {
                        @Override
                        public void onSpawn(NpcInstance npcInstance) {
                            if(npcInstance.getNpcId() == skill.getNpcId()) {
                                System.out.println(npcInstance.getFollowTarget());
                                npcInstance.setTarget(creature);
                                npcInstance.moveToRelative(creature, 1, 2);
                                System.out.println("---------------------------");
                                System.out.println(npcInstance.getFollowTarget());
                                System.out.println(npcInstance.isFollowing());
                            }
                        }
                    });
                }
            }
        });
    }

    @Override
    public void onReload() { }

    @Override
    public void onShutdown() { }
}

Все события и проверки проходятся, но никак не могу понять, как установить followTarget, потому что стандартный setTarget ничего не даёт
Консоль на оба getFollowTarget() выдаёт null (что ожидаемо)
А на isFollowing(), само собой - false
Если смотреть подробнее, как устроен getFollowTarget, то там присутствует тип MoveToRelativeAction, нашел метод moveToRelative(GameObject var1, int var2, int var3), первый параметр ясно - к кому двигаться (GameObject), а вот второй и третий int вообще не понимаю, что это за значения и правильное ли направление я взял для установки followTarget
 
var2 - отступ
var3 - ренжа

moveToRelative необходимо выполнять по таску каждое n время.
 
var2 - отступ
var3 - ренжа

moveToRelative необходимо выполнять по таску каждое n время.
Спасибо за подсказку! Поскольку вчера только влез во всю эту тему со скриптами для Л2, ещё ничего не знаю... Не понимаю, надо вынести таск в отдельный файл и регистрировать его (registerTask), а потом добавлять (addTask) или можно как-то одну эту строчку сразу в addTask пихнуть?
 
Пока что решил задачу классическим таймером, если кто-то подскажет реализацию TaskManager, буду очень благодарен.
Не знаю, насколько это получилось оптимизировано и не забьет ли память постоянный таймер, но вот:
Java:
package Simple;

import l2.gameserver.listener.actor.OnMagicUseListener;
import l2.gameserver.listener.actor.npc.OnSpawnListener;
import l2.gameserver.model.Creature;
import l2.gameserver.model.Skill;
import l2.gameserver.model.actor.listener.NpcListenerList;
import l2.gameserver.model.actor.listener.PlayerListenerList;
import l2.gameserver.model.instances.NpcInstance;
import l2.gameserver.scripts.ScriptFile;

import java.util.Timer;
import java.util.TimerTask;

public class SimpleCode implements ScriptFile {
    @Override
    public void onLoad() {
        PlayerListenerList.addGlobal(new OnMagicUseListener() {
            @Override
            public void onMagicUse(Creature creature, Skill skill, Creature creature1, boolean b) {
                if(skill.getId() == 100000) {
                    NpcListenerList.addGlobal(new OnSpawnListener() {
                        @Override
                        public void onSpawn(NpcInstance npcInstance) {
                            if(npcInstance.getNpcId() == skill.getNpcId()) {
                                Timer t = new Timer();
                                t.schedule(new TimerTask() {
                                    @Override
                                    public void run() {
                                        npcInstance.moveToRelative(creature, 5, 10);
                                    }
                                }, 0, 1000);
                            }
                        }
                    });
                }
            }
        });
    }

    @Override
    public void onReload() { }

    @Override
    public void onShutdown() { }
}
 
Back
Top