Снова агатионы на Interlude...

в чем проблема его сделать нпц без ников без не чего что его даже выделить не вохможно???? в сервере??????????????????????????????????????????
написал же как нпц выше дал тоже пример легкий чуток переделай для себя

нпц не могут атаковать мобы
нпц с запрет на таргет других игроков
нпц работает только с одеванием (приязываешь ему итем )
 
я тебе уже дал это все что тебе нужно описал
у меня есть все готовое без скриптов
и оно работает и нет проблем
 
я тебе уже дал это все что тебе нужно описал
у меня есть все готовое без скриптов
и оно работает и нет проблем
Та реализация, которую кидал выше - это через питомцев.
Любой питомец - NPC, а тип призываемого NPC определяется скиллом.

<set name="skillType" val="SUMMON"/>
<set name="summonType" val="NPC" /> Это спавн NPC, в таком случае он следовать за тобой не будет, у меня такая реализация, поэтому и написал скрипт, чтобы следовал, телепортировался за тобой и т.д.

<set name="skillType" val="SUMMON"/> А это то, как реализованы в твоем примере, таким образом он спавнится в качестве питомца, на которого могут агриться мобы, у которого есть рамка призванного саммона

Если делать так, как говоришь ты, то вытекают все проблемы, описанные мною до этого.
 
Та реализация, которую кидал выше - это через питомцев.
Любой питомец - NPC, а тип призываемого NPC определяется скиллом.





Если делать так, как говоришь ты, то вытекают все проблемы, описанные мною до этого.

///ты почти у цели думай думай)
 
у меня все работает и нету проблем )
У тебя кривые агатионы к тому же мои файлы скинул.. Слов нет). И твой скрин выше не твой же проект я тоже могу такое показать. По факту сделай видео и покажи раз такой умный. У меня они реализованы как петы он хочет более лучше чем у тебя. Как написал выше кодера найдите сделают на других форума много таких.
 
Last edited:
Привет!
Где-то месяц назад решил попробовать реализовать криво-косо агатионов под Interlude. Сейчас вернулся к этой теме, написал кастомное расширение, которое работает с одни большим "НО", всё прекрасно работает на одном игроке на сервере, но если их двое, то всё ломается, поэтому, можно сказать, что ничего не работает.
Предлагаю совместно допилить эту историю, если такое возможно, потому что многим админам серверов Interlude эта тема интересна.

Внимание! Я вообще не программист, от слова "совсем", код, скорее всего, не профессионален даже на 50%, просто пробую реализовать задуманное, поэтому прошу относиться с пониманием

Java:
package Simple;

import l2.commons.threading.RunnableImpl;
import l2.gameserver.ThreadPoolManager;
import l2.gameserver.listener.actor.OnMagicUseListener;
import l2.gameserver.listener.actor.npc.OnSpawnListener;
import l2.gameserver.listener.actor.player.OnPlayerEnterListener;
import l2.gameserver.listener.actor.player.OnPlayerExitListener;
import l2.gameserver.listener.actor.player.OnTeleportListener;
import l2.gameserver.listener.inventory.OnEquipListener;
import l2.gameserver.model.Creature;
import l2.gameserver.model.Playable;
import l2.gameserver.model.Player;
import l2.gameserver.model.Skill;
import l2.gameserver.model.actor.listener.NpcListenerList;
import l2.gameserver.model.actor.listener.PlayerListenerList;
import l2.gameserver.model.entity.Reflection;
import l2.gameserver.model.instances.NpcInstance;
import l2.gameserver.model.items.ItemInstance;
import l2.gameserver.scripts.ScriptFile;
import org.jetbrains.annotations.NotNull;

import java.util.HashMap;

public class SimpleCode implements ScriptFile {

    public agathion a;

    @Override
    public void onLoad() {
        PlayerListenerList.addGlobal(new OnPlayerEnterListener() {
            @Override
            public void onPlayerEnter(Player player) {
                a = new agathion(player);
                a.setHasAgathion(false);
                a.getData().forEach((dItem, dSkill) -> {
                    if(a.getPlayer().getAllSkills().stream().anyMatch(s -> s.getId() == dSkill)) {
                        a.setDataSkill(dSkill);
                        a.setDataItem(dItem);
                    }
                });
                if(a.getPlayer().getAllSkills().stream().anyMatch(s -> s.getId() == 100012)) {
                    a.setSummonSkill(a.getPlayer().getKnownSkill(a.getDataSkill()));
                    a.setUnSummonSkill(a.getPlayer().getKnownSkill(100012));
                    a.getPlayer().addUnActiveSkill(a.getUnSummonSkill());
                }
                a.getPlayer().getInventory().addListener(new OnEquipListener() {
                    @Override
                    public void onEquip(int i, ItemInstance itemInstance, Playable playable) {
                        if(a.getData().containsKey(itemInstance.getItemId())) {
                            a.setDataItem(itemInstance.getItemId());
                            a.setDataSkill(a.getData().get(a.getDataItem()));
                            if (!a.getHasAgathion()) {
                                a.setSummonSkill(a.getPlayer().getKnownSkill(a.getDataSkill()));
                                a.setUnSummonSkill(a.getPlayer().getKnownSkill(100012));
                                a.getPlayer().addUnActiveSkill(a.getUnSummonSkill());
                            }
                        }
                    }

                    @Override
                    public void onUnequip(int i, ItemInstance itemInstance, Playable playable) {
                        if(itemInstance.getItemId() == a.getDataItem() && a.getHasAgathion()) {
                            a.getAgathionNpc().deleteMe();
                            a.setHasAgathion(false);
                            a.getPlayer().removeUnActiveSkill(a.getSummonSkill());
                            a.getPlayer().addUnActiveSkill(a.getUnSummonSkill());
                        }
                    }
                });
            }
        });
        PlayerListenerList.addGlobal(new OnMagicUseListener() {
            @Override
            public void onMagicUse(Creature creature, Skill skill, Creature creature1, boolean b) {
                a.agathionSpawn(skill);
            }
        });
        PlayerListenerList.addGlobal(new OnTeleportListener() {
            @Override
            public void onTeleport(Player player, int i, int i1, int i2, Reflection reflection) {
                if (a.getHasAgathion())
                    a.teleportAgathion(a.getAgathionNpc(), i, i1, i2);
            }
        });
        PlayerListenerList.addGlobal(new OnPlayerExitListener() {
            @Override
            public void onPlayerExit(Player player) {
                if (a.getHasAgathion())
                    a.deleteAgathion(a.getAgathionNpc());
            }
        });
    }

    @Override
    public void onReload() { }

    @Override
    public void onShutdown() { }

    private static class agathion {
        private final Player player;
        private NpcInstance agathionNpc;
        private boolean hasAgathion;
        private Skill summonSkill;
        private Skill unSummonSkill;
        private final HashMap<Integer, Integer> data = new HashMap<Integer, Integer>();
        private int dataSkill;
        private int dataItem;

        private agathion(Player p) {
            data.put(9411, 100000);
            data.put(9412, 100001);
            data.put(9413, 100002);
            data.put(9414, 100003);
            data.put(9415, 100004);
            data.put(9416, 100005);
            data.put(9417, 100006);
            data.put(9418, 100007);
            data.put(9419, 100008);
            data.put(9420, 100009);
            data.put(9421, 100010);
            data.put(9422, 100011);
            this.player = p;
        }
        public void agathionSpawn(Skill s) {
            if(s == this.getSummonSkill()) {
                NpcListenerList.addGlobal(new OnSpawnListener() {
                    @Override
                    public void onSpawn(NpcInstance npcInstance) {
                        if(npcInstance.getNpcId() == summonSkill.getNpcId()) {
                            agathionNpc = npcInstance;
                            hasAgathion = true;
                            System.out.println(player);
                            player.removeUnActiveSkill(unSummonSkill);
                            player.addUnActiveSkill(summonSkill);
                            ThreadPoolManager.getInstance().schedule(new agathionFollow(player, agathionNpc), 250L);
                        }
                    }
                });
            }
            if(s == this.getUnSummonSkill()) {
                this.setHasAgathion(false);
                this.deleteAgathion(this.getAgathionNpc());
                player.removeUnActiveSkill(this.getSummonSkill());
                player.addUnActiveSkill(this.getUnSummonSkill());
            }
        }
        public void deleteAgathion(@NotNull NpcInstance n) { n.deleteMe(); }
        public void teleportAgathion(@NotNull NpcInstance n, int x, int y, int z) { n.teleToLocation(x, y, z); }
        public boolean getHasAgathion() { return this.hasAgathion; }
        public void setHasAgathion(boolean b) { this.hasAgathion = b; }
        public NpcInstance getAgathionNpc() { return this.agathionNpc; }
        public void setAgathionNpc(NpcInstance n) { this.agathionNpc = n; }
        public Skill getSummonSkill() { return this.summonSkill; }
        public void setSummonSkill(Skill s) { this.summonSkill = s; }
        public Skill getUnSummonSkill() { return this.unSummonSkill; }
        public void setUnSummonSkill(Skill s) { this.unSummonSkill = s; }
        public HashMap<Integer, Integer> getData() { return this.data; }
        public int getDataSkill() { return this.dataSkill; }
        public void setDataSkill(int i) { dataSkill = i; }
        public int getDataItem() { return this.dataItem; }
        public void setDataItem(int i) { dataItem = i; }
        public Player getPlayer() { return this.player; }
    }

    private static class agathionFollow extends RunnableImpl {
        private final Player player;
        private final NpcInstance agathion;

        private agathionFollow(Player p, NpcInstance n) {
            this.player = p;
            this.agathion = n;
        }

        public void runImpl() {
            this.agathion.moveToRelative(this.player, 5, 10);
            ThreadPoolManager.getInstance().schedule(this, 250L);
        }
    }
}
Физически агатионы реализованы через NPC, есть item'ы (armor, не etcitem) с эквипом в слот HEAD, персонаж одевает item в установленный слот, получает дополнительные умения - призыв и отпуск агатиона.
Получается: каждый агатион - npc, item, skills
  1. Необходимо, чтобы дудка (item) одевался на персонажа для получения дополнительных характеристик, даже не призывая агатиона, если создавать etcitem, то такая реализация будет невозможной
  2. Необходимо будет убирать у агатиона рамку призванного питомца, с такой задачей не смог справиться, не нашел ни единого упоминания подобного метода ни в server.jar, ни в script.jar библиотеках
  3. Необходимо реализовать агатиона таким образом, чтобы на него никто не агрился и его нельзя было взять в таргет абсолютно никаким образом, с таргетом еще более менее решаемо, хоть параметр TargetEnabled не работает, возможно выставить collision_height и collision_radius на значение 0.01, как это реализовано у NPC "Christmas Tree" (13006), но с агром мобов на NPC вопрос не решается, если NPC выступает в роли саммона/питомца

Дополнительно прикладываю скомпиленное расширение, чтобы можно было попробовать, как это работает
Необходимо реализовать агатиона таким образом, чтобы на него никто не агрился и его нельзя было взять в таргет абсолютно никаким образом, с таргетом еще более менее решаемо
Напиши в лс подскажу что сделать Телега @Vikos177
 
А как же спавн нпц трейдера гномом?)) на него вроде никто не агрится)))
 
И вообще в 2023 году на клиенте ит играть и что-то делать это мазахизм, это как в 2023 году жить в ссср
 
И вообще в 2023 году на клиенте ит играть и что-то делать это мазахизм, это как в 2023 году жить в ссср
Раньше было лучше...
ИМХО ковырять, ломать голову над реализацией агатионов не оправдывает себя по итогу. Хочешь агатионы - переходи на ветку классик. Издеваться над трупом ц6 внедряя кастом такое себе дело.
 
Раньше было лучше...
ИМХО ковырять, ломать голову над реализацией агатионов не оправдывает себя по итогу. Хочешь агатионы - переходи на ветку классик. Издеваться над трупом ц6 внедряя кастом такое себе дело.
Не каждый школьник готов и может поставить себе клиентку классик )))) Увы

Я когда стартовал, мне скрины кидали, у ребят виста ещё стоит как ОС, мало этого люди на таких машинах гамают, верно написано из ссср )))
 
У тебя кривые агатионы к тому же мои файлы скинул.. Слов нет). И твой скрин выше не твой же проект я тоже могу такое показать. По факту сделай видео и покажи раз такой умный. У меня они реализованы как петы он хочет более лучше чем у тебя. Как написал выше кодера найдите сделают на других форума много таких.
Я не заставляю не кого верить я написал как вижу это я разводить срач я не хочу увы выше все сказал
 
У тебя кривые агатионы к тому же мои файлы скинул.. Слов нет). И твой скрин выше не твой же проект я тоже могу такое показать. По факту сделай видео и покажи раз такой умный. У меня они реализованы как петы он хочет более лучше чем у тебя. Как написал выше кодера найдите сделают на других форума много таких.
По файлах кто то где то отрицал ? Апнул тему пустой диалог
 
И вообще в 2023 году на клиенте ит играть и что-то делать это мазахизм, это как в 2023 году жить в ссср
Нет, это как в 23 году иметь ламповый телевизор
 
Нет, это как в 23 году иметь ламповый телевизор
te6tydbprrkfjrpf7gq035tpey8.jpeg




ты чего он балдежный))
 
Back
Top