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

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

Grekk

Прославленный
Участник
Старожил I степени
Сообщения
272
Розыгрыши
0
Решения
1
Репутация
85
Реакции
238
Баллы
1 425
Хроники
  1. Master Class
Исходники
Присутствуют
Сборка
l2jmobius
Подскажите как лучше сделать начало скрипта. Требуется что бы нпц кричали фразу в шаут чат, то есть в тот который вызывается при помощи знака "!".
При том что бы в этом скрипте можно было привязывать фразу нпц к определенному ИД нпц например 90001 кричит "Привет" каждый допустим 2 минуты. А нпц 90002 кричит "пока" каждые 5 минут. Как понимаю обработка должна идти через хандлер чара ChatShout.java. Помню такое было в какой то ИТ сборке но не могу найти где что бы посмотреть как это реализовано. Спасибо всем кто откликнется. Сборка 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>
 
Последнее редактирование:
Сделай просто возможность передавать настройки "болтовни" нпс через параметры 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 из общего хранилища самих нпс - не знаю как в мобиусе назвается общее хранилище всех объектов типа игроков, нпс и т.д.

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

Код:
    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"));
 
идём на говорящий остров, ищем нпс-а который кричит что-то в чат.
Открываем его параметры через shift tab
Смотрим его ид
Идём в скрипты - ищем по ид
Копируем скрипт, а именно

stattQuestTime("repeat_talk");

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