Написание скрипта l2jmobius

Статус
В этой теме нельзя размещать новые ответы.

Grekk

Прославленный
Участник
Сообщения
272
Розыгрыши
0
Решения
1
Репутация
85
Реакции
238
Баллы
1 425
Хроники
  1. Master Class
Исходники
Присутствуют
Сборка
l2jmobius
Подскажите как лучше сделать начало скрипта. Требуется что бы нпц кричали фразу в шаут чат, то есть в тот который вызывается при помощи знака "!".
При том что бы в этом скрипте можно было привязывать фразу нпц к определенному ИД нпц например 90001 кричит "Привет" каждый допустим 2 минуты. А нпц 90002 кричит "пока" каждые 5 минут. Как понимаю обработка должна идти через хандлер чара ChatShout.java. Помню такое было в какой то ИТ сборке но не могу найти где что бы посмотреть как это реализовано. Спасибо всем кто откликнется. Сборка l2jmobius
 
Так есть же в ХФ например крикун в гиране возле церкви вот и возьми его за основу.
 
да искал не могу найти, сейчас вот это пробую переделать.
Не могу найти где у мобиуса получение листа нпц что бы потом вытаскивать ид нпц
код
Код:
package events.NpcChatter;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.network.serverpackets.NpcSay;

public class NpcChatter {

    private static final Map<Integer, String> npcMessages = new HashMap<>();
    private static final Map<Integer, Integer> npcChatIntervals = new HashMap<>();

    public static void main(String[] args) {
        // Инициализация сообщений и интервалов для НПС
        npcMessages.put(90001, "Привет");
        npcChatIntervals.put(90001, 120000); 

        npcMessages.put(90002, "Пока");
        npcChatIntervals.put(90002, 300000); 

        
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new ChatTask(), 0, 1000); 
    }

    private static class ChatTask extends TimerTask {
        @Override
        public void run() {
            
            for (Npc npc : InstanceManager.getInstance().getNpcList()) {
                int npcId = npc.getNpcId();

                // Проверяем, есть ли сообщение для текущего НПС
                if (npcMessages.containsKey(npcId)) {
                    // Проверяем, пора ли отправлять сообщение
                    if (System.currentTimeMillis() % npcChatIntervals.get(npcId) == 0) {
                        // Отправляем сообщение в чат
                        String message = npcMessages.get(npcId);
                        for (Player player : npc.getKnownList().getKnownPlayers()) {
                            player.sendPacket(new NpcSay(npc, 0, message));
                        }
                    }
                }
            }
        }
    }
}
это не могу найти как обратиться и получить - InstanceManager.getInstance().getNpcList()
потом это - int npcId = npc.getNpcId();
дальше идет цикл который тоже какие то другие методы использует
for (Player player : npc.getKnownList().getKnownPlayers()) {
player.sendPacket(new NpcSay(npc, 0, message));
}
 
Сделай просто возможность передавать настройки "болтовни" нпс через параметры AI и запили обработку этого в базовом AI для всех нпс и в итоге не придется делать такой костыль как у тебя.

у меня это так и сделано - я могу или в шаблоне нпс прописать параметры AI или прямо в спавне конкретно нпс, чтобы он что-то говорил/кричал в чат с нужной периодичностью.
Проверки необходимости что-то произнести и само произношение проверяются в соответствующих методах AI. Для овера это thinkActive, thinkAttack, onEvtSpawn, onEvtDead.
Код:
    talkOnIdle - Задает фразы, которые должен периодически произносить NPC, находясь в состоянии покоя.
        Задается в виде строки с параметрами вида "key=value#key=value#key=value#...". Возможные ключи и их значения:
            id - id фраз из NpcString-ru.dat клиента. Можно задавать несколько id, перечисляя их через точку с
                запятой - тогда при попытке говорить будет выбираться случайное id из списка.
            chance - Шанс произношения фразы, в процентах. Значение по умолчанию: 100.
            period - Период произношения фраз. Необходимо указывать 1 или 2 значения: 1 - основной период с которым
                произносятся фразы, 2 - в каких пределах дополнительно рандомизировать это время. Если не
                задавать второе значение то оно будет равно 0. Значения задаются в секундах.
                Значение по умолчанию: 60;0.
            shout - Указывает признак того, что NPC должен заданные фразы кричать. Значение по умолчанию: false.

    talkOnAttack - Задает фразы, которые должен периодически произносить NPC, находясь в состоянии атаки.
        Формат аналогичен параметру talkOnIdle.

    talkOnSpawn - Задает фразы, которые должен произносить NPC при своем появлении.
        Формат аналогичен параметру talkOnIdle, за исключением отсутствия ключа period.

    talkOnDead - Задает фразы, которые должен произносить NPC при своей смерти.
        Формат аналогичен параметру talkOnIdle, за исключением отсутствия ключа period.
например тут нпс будет с периодичностью 30-45 сек. пытаться произнести случайно одну из двух фраз с шансом 25%.
XML:
    <spawn>
        <npc id="8540" count="1">    <!-- Джейс [Учитель Астрологии] / Jayce [Fortunetelling Mentor] / [g_luckygame_jason] -->
            <set name="talkOnIdle" value="id=2000156;2000157#chance=25#period=30;15" />
        </npc>
        <point x="148040" y="26650" z="-2200" h="8191" />
    </spawn>
 
Последнее редактирование:
это уже более сложный уровень мне бы хотяб пока просто мой скрипт завести, не могу найти нужные методы отработчки что бы хотяб получать список нпц, потом ид и там уже проверяет если ли ид в списке сообщений
 
а зачем тебе всех нпс перебирать то?
почему не пробегаться чисто по ключам мапы npcMessages?
ну или сразу по entry, чтобы и сообщение сразу получать.

т.е. вместо
Java:
for (Npc npc : InstanceManager.getInstance().getNpcList())
сделать
Java:
for (Entry<Integer, String> entry : npcMessages.entrySet())
{
    int npcId = entry.getKey();
    String msg = entry.getValue();

    ...

        // тут выдернуть по npcId из общего хранилища самих нпс - не знаю как в мобиусе назвается общее хранилище всех объектов типа игроков, нпс и т.д.

    ...
}
 
Последнее редактирование:
не тот уровень как у тебя вот и пытаюсь разобраться,
если не сложно подскажи как лучше эту функцию реализовать

Код:
    private static class ChatTask extends TimerTask {
        @Override
        public void run() {

            for (Npc npc : InstanceManager.getInstance().getAllNpcs()) {
                int npcId = npc.getId();


                if (npcMessages.containsKey(npcId)) {

                    if (System.currentTimeMillis() % npcChatIntervals.get(npcId) == 0) {

                        String message = npcMessages.get(npcId);
                        for (Player player : npc.getKnownList().getKnownPlayers().values()) {
                            player.sendPacket(new NpcSay(npc, "SHOUT", message));
                        }
                    }
                }
            }
        }
    }
 
+ еще npcMessages и npcChatIntervals можно соединить в одну мапу, просто храня мессагу и интервал произношения в виде Pair например
Java:
private static final Map<Integer, Pair<String, Integer>> npcMessages = new HashMap<>();
 
идём на говорящий остров, ищем нпс-а который кричит что-то в чат.
Открываем его параметры через shift tab
Смотрим его ид
Идём в скрипты - ищем по ид
Копируем скрипт, а именно

stattQuestTime("repeat_talk");

onEvent(Player player, Npc npc, Sting event)
{
case "repeat_talk":
{
npc.broadcastpacket(new Say2(ChatType.SHOUT, "npc_name", "text"));
 
да искал его но у мобиуса его нету
 
тему можно закрыть спасибо всем
 
Статус
В этой теме нельзя размещать новые ответы.