Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
рандом сообщения в шаут\трейд
#1
Доброго дня ув. форумчане.
Пожалуйста помогите с маленьким ява (или питоновским) скриптом.

Существует такой скрипт, как авто-аннонсы на python:

Код:
import sys
from net.sf.l2j.gameserver import Announcements
from net.sf.l2j.gameserver import ThreadPoolManager
from java.lang import Runnable

print "Auto Announce running."

# Ставим интервал в минутах.
INTERVAL = 10

# Наше сообщение
ANNOUNCEMENTS= ["announce #1", \
                "announce #2", \
                "announce #3"  ]

class myTask( Runnable ):
    def __init__( self ):
        self.name = "autoAnnouncer"
    def run( self ):
        for ann  in ANNOUNCEMENTS:
            Announcements.getInstance().announceToAll(ann )

startInstance = myTask()
ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(startInstance,INTERVAL*60000,INTERVAL*60000)

мы заносим строчки в массив ANNOUNCEMENTS, и выводим их потом последовательно, через определенный промежуток времени.

помогите модифицировать этот скрипт, с определенными условиями:

1) сообщение выводилось не от Announcements - а в трейд чат или шаут(от какого-нибудь имени, которое можно указать заранее), как бы псевдо-игрок.
2) собственно что бы можно было выводить это сообщение на русском (желательно, если возможно).
3) что бы вывод был не последовательным, а рандомным - т.е. к примеру общей конфигурации - каждые 15 секунд, в трейд чат выводится сообщение от определенного имени(псевдо-игрока), где сам текст и имя - внесены и берутся рандомно из массива в котором хранятся эти строчки (как в массиве ANNOUNCEMENTS, правда там нет имени, т.к. сообщение выводится от announcements), напр. как результат, такое в трейд чате: "Votebot: Голосуйте за сервер!".

Перекопал исходники, думал сделать по принципу Passenger Boat Info. но там совсем иначе и намного запутаннее.. через csv, и много урезать мусора..

Очень надеюсь на вашу помощь! спасибо всем заранее.
[Изображение: ck.gif]
Ответ
#2
А шоут и трейд у вас на весь мир?
Ответ
#3
Для анонсов нпц не требуется. Для CreatureSay (который вам и нужен) в пакете обязательно наличие objectId персонажа, который эту фразу говорит. Т.е. вам нужно броадкастить CreatureSay от какого-то действующего персонажа в мире. Смотрите как реализован AutoChat.
Ответ
#4
Цитата:А шоут и трейд у вас на весь мир?
да.

Цитата:Смотрите как реализован AutoChat.
а где это можно глянуть??? у меня сборка фрозенов ИЛ
[Изображение: ck.gif]
Ответ
#5
ANZO Написал:Для анонсов нпц не требуется. Для CreatureSay (который вам и нужен) в пакете обязательно наличие objectId персонажа, который эту фразу говорит. Т.е. вам нужно броадкастить CreatureSay от какого-то действующего персонажа в мире. Смотрите как реализован AutoChat.
Не обязательно, можно и с 0'ым objectId рассылать.
Ответ
#6
в общем познания в яве очень плохие(, помогите разобраться и правильно дописать:

Код:
package com.l2jfrozen.gameserver.ai.special;

import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.model.quest.Quest;
import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
import com.l2jfrozen.gameserver.network.clientpackets.Say2;
import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
import com.l2jfrozen.util.random.Rnd;

public class TradeChat extends Quest implements Runnable
{
    private static final String[] TR_TEXT =
    {
        "Testchat1",
        "Testchat2",
        "TestChat3",
        "TestChat4",
        "TestChat5"
    };
    private static final String[] TR_NICK =
    {
        "MrOne",
        "MrTwo",
        "MrThree",
        "MrFour",
        "MrFive"
    };
    
    public TradeChat(int questId, String name, String descr)
    {
    super(questId, name, descr);
    

    private void ShowChat()
    {
        while(1)
        {
            if(Rnd.get(TR_TEXT))
            if(Rnd.get(TR_NICK))
            CreatureSay cs = new CreatureSay(0, тип чата, "ник от которого шлется сообщение", "сообщение");    
            activeChar.sendPacket(cs);
            //startQuestTimer("Start", 10000, npc, null);
            Wait(500);
        }
    }
    
    @Override
    public void run() {}
}

набросал кусками из разных мест, не судите строго.

просто не знаю как лучше сделать, до этого делал все подобные скрипты - через Quest.

может быть существует более простой способ.. просветите)

В общем смысл таков, что есть бесконечный цикл, в нем "рандомно" выбирается из заданных массивов ник + текст, и через CreatureSay выводится уже как сообщение чата. после того как сообщение выведется, стартует таймер (или просто чтото типа Wait/Sleep), например 2 минуты. через две минуты цикл заканчивается, и начинается заново. и каждый раз мы получаем рандом значения из массивов (ник и текст), без всяких проверок на предыдущее и тп.

Очень прошу помощи! Заранее очень вам благодарен!
[Изображение: ck.gif]
Ответ
#7
ТС! Перестаньте смешить народ. После просмотра вашего "кода" с трудом вылезается из-под стола. Сделайте перерыв в работе на полгодика, выучите Java!
Ответ
#8
Цитата:ТС! Перестаньте смешить народ. После просмотра вашего "кода" с трудом вылезается из-под стола. Сделайте перерыв в работе на полгодика, выучите Java!
я счастлив. я не прошу написать ОСь на яве, это всего лишь маленький скрипт. если кто-то разбирается в этом и для него это дело плевое, почему так сложно написать пару строчек и подсказать хотя бы в чем -то? к сожалению нет времени полноценно выучить язык, но частями - я способен понять, просто надеюсь на хороших людей, которые подскажут.

offtop
[Изображение: ck.gif]
Ответ
#9
mego4el Написал:я счастлив. я не прошу написать ОСь на яве, это всего лишь маленький скрипт. если кто-то разбирается в этом и для него это дело плевое, почему так сложно написать пару строчек и подсказать хотя бы в чем -то? к сожалению нет времени полноценно выучить язык, но частями - я способен понять, просто надеюсь на хороших людей, которые подскажут.

offtop

Нет времени выучить язык? Идите в раздел рынок.

Здесь с удовольствием помогут, только если увидят, что вы стараетесь и думаете.

[src=java]
while(1)
{
if(Rnd.get(TR_TEXT))
if(Rnd.get(TR_NICK))
CreatureSay cs = new CreatureSay(0, тип чата, "ник от которого шлется сообщение", "сообщение");
activeChar.sendPacket(cs);
//startQuestTimer("Start", 10000, npc, null);
Wait(500);
}
[/src]

Бесконечный цикл говорит о том, что вы вообще не думаете.

Во вторых вам не нужно создавать дочерний класс от квеста, достаточно просто использовать интерфейс Runnable и инициализировать его из того-же GameServer (при запуске сервера).

Примерно так [src=java]
//Инициализиурет метод run() в классе TradeChat каждые 60000 миллисекунд (60 секунд).
ThreadPoolManager.getInstance().scheduleAtFixedDelay(new TradeChat, 0, 60000);
[/src]

В теле метода run() совершайте отправку сообщений[src=java]
@Override
public void run()
{
//По нику или ObjId получайте инстанс персонажа..
L2PcInstance player = L2World.getPlayer("NAME");
// .. ну и отправляйте пакет.
}
[/src]
пф.. ужас.. дальше я коментировать отказываюсь, ибо вы такую хрень написали..
Ответ
#10
Ro_0TT, спасибо большое.

а как можно реализовать рандом-выборку ников\сообщений и возможно ли это вообще? (как я написал на примере массивов)

Добавлено через 19 минут
Цитата:В теле метода run() совершайте отправку сообщений
маленький вопрос.. а где должен находится tradechat.java внутри с этим методом, что бы ThreadPoolManager мог его правильно прогрузить?
[Изображение: ck.gif]
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Системные сообщения volumeOne 34 5,139 01-03-2013, 02:04 AM
Последний пост: orionpvp
  Системные сообщения volumeOne 2 1,476 10-25-2012, 08:39 PM
Последний пост: volumeOne
  пустой трейд Bagoc 3 1,870 01-31-2012, 04:31 PM
Последний пост: Bagoc
  Трейд jaccass 2 1,698 07-15-2011, 11:46 AM
Последний пост: MROBAR
  Налоги на трейд HastemaNS 2 1,833 12-10-2010, 04:29 PM
Последний пост: HastemaNS

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)