Как закрыть Community Board после использования

accavit

Пляшущий с бубном
Участник
Сообщения
133
Розыгрыши
0
Решения
2
Репутация
0
Реакции
22
Баллы
220
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
Lucera 1.7
После телепорта куда-либо через Community Board персонаж телепортируется, а CB открывает страничку с надписью "Счастливого пути!". После телепорта приходится каждый раз закрывать окно CB. Как можно сделать, чтобы CB закрывалось само после телепорта?
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Java:
activeChar.sendPacket(new HideBoard());
 
судя по коду интерфейса, будет достаточно ещё раз кинуть пакет открытия борды, ибо она смотрит открыта или нет и если открыта - закрывается и делает ретурн
QPQsiW8.png
 
5. Запрещено публиковать исходный код без BB-кода — CODE.
default_npc, у меня нет отдельного скрипта для CB. Только через ядро всё. А в нем нет функции HandleShowBBS. Может она как-то по-другому там называется?

Java:
    public boolean handleCommand(L2PcInstance activeChar, String command) {
        String cmd = command.substring(4);
        String params = "";
        if (cmd.contains(" ")) {
            params = cmd.substring(cmd.indexOf(" ") + 1);
            cmd = cmd.substring(0, cmd.indexOf(" "));
        }

        IBBSHandler handler = this.getHandler(cmd);
        if (handler != null) {
            String result = handler.handleCommand(activeChar, cmd, params);
            if (result == null) {
                activeChar.sendPacket(new HideBoard());
                return true;
            } else {
                if (result.endsWith(".htm")) {
                    result = HtmCache.getInstance().getHtm("data/html/CommunityBoard/" + result, activeChar);
                    if (result == null) {
                        activeChar.sendPacket(new HideBoard());
                        return true;
                    }
                }

                Pattern p = Pattern.compile("bypass +-h");
                Matcher m = p.matcher(result);
                if (m.find()) {
                    result = m.replaceAll("bypass");
                }

                separateAndSend(result, activeChar);
                return true;
            }
        } else {
            return false;
        }
    }

Есть вот такой кусок кода похожий
 
Последнее редактирование модератором:
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
activeChar.sendPacket(new НеЛагатьИДанатыНаКвартируПлиз());
Пакета HideBoard нет вообще, от слова совсем.
Java:
{
    private static final String    _S__6E_SHOWBOARD    = "[S] 6e ShowBoard";

    @Override
    protected final void writeImpl()
    {
        writeC(0x6E);
        writeC(0x00); //c4 1 to show community 00 to hide
    }

    /* (non-Javadoc)
     * @see ru.catssoftware.gameserver.serverpackets.ServerBasePacket#getType()
     */
    @Override
    public String getType()
    {
        return _S__6E_SHOWBOARD;
    }
}
ну как сказать это огрызок этого пакета
Java:
public class ShowBoard extends L2GameServerPacket
{
    private static final String    _S__6E_SHOWBOARD    = "[S] 6e ShowBoard";

    private String                _htmlCode;
    private String                _id;
    private List<String>        _arg;

    public ShowBoard(String htmlCode, String id)
    {
        _id = id;
        _htmlCode = htmlCode;
        
    }

    public ShowBoard(List<String> arg)
    {
        _id = "1002";
        _htmlCode = null;
        _arg = arg;
    }

    private byte[] get1002()
    {
        int len = _id.getBytes().length * 2 + 2;
        for (String arg : _arg)
        {
            len += (arg.getBytes().length + 4) * 2;
        }
        byte data[] = new byte[len];
        int i = 0;
        for (int j = 0; j < _id.getBytes().length; j++, i += 2)
        {
            data[i] = _id.getBytes()[j];
            data[i + 1] = 0;
        }
        data[i++] = 8;
        data[i++] = 0;
        for (String arg : _arg)
        {
            for (int j = 0; j < arg.getBytes().length; j++, i += 2)
            {
                data[i] = arg.getBytes()[j];
                data[i + 1] = 0;
            }
            data[i++] = 0x20;
            data[i++] = 0x0;
            data[i++] = 0x8;
            data[i++] = 0x0;
        }
        return data;
    }

    @Override
    protected final void writeImpl()
    {
        writeC(0x6E);
        writeC(0x01); //c4 1 to show community 00 to hide
        writeS("bypass _bbshome"); // top
        writeS("bypass _bbsgetfav"); // favorite
        writeS("bypass _bbsloc"); // region
        writeS("bypass _bbsclan"); // clan
        writeS("bypass _bbsmemo"); // memo
        writeS("bypass _bbsmail"); // mail
        writeS("bypass _bbsfriends"); // friends
        writeS("bypass  bbs_add_fav"); // add fav.
        if(_htmlCode!=null)
            _htmlCode = HTMParser.parseHTM(_htmlCode, getClient().getActiveChar());
//        if(_id.equalsIgnoreCase("101"))
//            getClient().getActiveChar().cleanBypasses(true);
//        _htmlCode = getClient().getActiveChar().encodeBypasses(_htmlCode, true);
        
        if (!_id.equals("1002"))
        {
            // getBytes is a very costly operation, and should only be called once
            byte[] htmlBytes = new byte[0];
            if (_htmlCode != null) {
                htmlBytes = _htmlCode.getBytes();
            }

            byte[] idBytes = _id.getBytes();
            byte data[] = new byte[2 + 2 + 2 + idBytes.length * 2 + 2 * ((_htmlCode != null) ? htmlBytes.length : 0)];
            int i = 0;
            for (int j = 0; j < idBytes.length; j++, i += 2)
            {
                data[i] = idBytes[j];
                data[i + 1] = 0;
            }
            data[i++] = 8;
            data[i++] = 0;

            byte[] html = new byte[0];
            if (_htmlCode != null)
            {
                try
                {
                    html = _htmlCode.getBytes("UTF-16LE");
                }
                catch (UnsupportedEncodingException e)
                {
                    html = new byte[_htmlCode.length() * 2];
                    for (int j = 0; j < htmlBytes.length; i += 2, j++)
                    {
                        data[i] = htmlBytes[j];
                        data[i + 1] = 0;
                    }
                }
            }
            System.arraycopy(html, 0, data, i, html.length);
            i += html.length;

            data[i++] = 0;
            data[i] = 0;
            writeB(data);
        }
        else
        {
            writeB(get1002());
        }
    }

    /* (non-Javadoc)
     * @see ru.catssoftware.gameserver.serverpackets.ServerBasePacket#getType()
     */
    @Override
    public String getType()
    {
        return _S__6E_SHOWBOARD;
    }
}
 
  • Мне нравится
Реакции: Rolo
default_npc, у меня нет отдельного скрипта для CB. Только через ядро всё. А в нем нет функции HandleShowBBS. Может она как-то по-другому там называется?
там есть второй пакет, который уж точно должен быть
если один из его аргументов приходит <1, то окно закрывается
костыль? костыль
хорошо? хорошо

else if (Event_ID == EV_ShowBoardPacket)
1626087513678.png
 
  • Мне нравится
Реакции: Rolo
В CommunityBoard.class этого ничего нет. Где вы все это нашли?
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
masone, Да это то я нашел, а откуда люди выше пишут про showboard и UIAPI_WINDOW?

Я так понял, что мне надо найти класс, отвечающий за ТП через Comm.Board и найти строки, где описан метод телепортации. А потом в конце этого метода добавить
Java:
activeChar.sendPacket(new HideBoard());
? Правильно понимаю?
 
masone, Да это то я нашел, а откуда люди выше пишут про showboard и UIAPI_WINDOW?

Я так понял, что мне надо найти класс, отвечающий за ТП через Comm.Board и найти строки, где описан метод телепортации. А потом в конце этого метода добавить
Java:
activeChar.sendPacket(new HideBoard());
? Правильно понимаю?
ну лучше чтоб не менять class в ядре постоянно, вынести как ни будь это в дп
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
а в теории default_npc, возможно в interface.u запихать HideWindow для кб при телепортации же?
 
DarkEmpire, вот такой вариант, мне кажется, проще. Как это сделать?
 
//del, для КБ не подходит
пакет ShowBoard, первый параметр отвечает за флаг показать/скрыть КБ
Java:
        writeC(_show); //c4 0x01 to show community 0x00 to hide
        for (String bbsBypass : DIRECT_BYPASS) {
            writeS(bbsBypass);
        }
        writeS(_addFav);
        String str = _id + "\u0008";
        if(_id != null && !_id.isEmpty() && !_id.equals("1002")) {
            if(_htmlCode != null) {
                str += _htmlCode;
            }
        } else {
            for(String arg : _arg) {
                str += arg + " \u0008";
            }
        }
        writeS(str);
 
Последнее редактирование:
  • Мне нравится
Реакции: Rolo
Java:
{
    private static final String    _S__6E_SHOWBOARD    = "[S] 6e ShowBoard";

    @Override
    protected final void writeImpl()
    {
        writeC(0x6E);
        writeC(0x00); //c4 1 to show community 00 to hide
    }

    /* (non-Javadoc)
     * @see ru.catssoftware.gameserver.serverpackets.ServerBasePacket#getType()
     */
    @Override
    public String getType()
    {
        return _S__6E_SHOWBOARD;
    }
}
ну как сказать это огрызок этого пакета
Java:
public class ShowBoard extends L2GameServerPacket
{
    private static final String    _S__6E_SHOWBOARD    = "[S] 6e ShowBoard";

    private String                _htmlCode;
    private String                _id;
    private List<String>        _arg;

    public ShowBoard(String htmlCode, String id)
    {
        _id = id;
        _htmlCode = htmlCode;
       
    }

    public ShowBoard(List<String> arg)
    {
        _id = "1002";
        _htmlCode = null;
        _arg = arg;
    }

    private byte[] get1002()
    {
        int len = _id.getBytes().length * 2 + 2;
        for (String arg : _arg)
        {
            len += (arg.getBytes().length + 4) * 2;
        }
        byte data[] = new byte[len];
        int i = 0;
        for (int j = 0; j < _id.getBytes().length; j++, i += 2)
        {
            data[i] = _id.getBytes()[j];
            data[i + 1] = 0;
        }
        data[i++] = 8;
        data[i++] = 0;
        for (String arg : _arg)
        {
            for (int j = 0; j < arg.getBytes().length; j++, i += 2)
            {
                data[i] = arg.getBytes()[j];
                data[i + 1] = 0;
            }
            data[i++] = 0x20;
            data[i++] = 0x0;
            data[i++] = 0x8;
            data[i++] = 0x0;
        }
        return data;
    }

    @Override
    protected final void writeImpl()
    {
        writeC(0x6E);
        writeC(0x01); //c4 1 to show community 00 to hide
        writeS("bypass _bbshome"); // top
        writeS("bypass _bbsgetfav"); // favorite
        writeS("bypass _bbsloc"); // region
        writeS("bypass _bbsclan"); // clan
        writeS("bypass _bbsmemo"); // memo
        writeS("bypass _bbsmail"); // mail
        writeS("bypass _bbsfriends"); // friends
        writeS("bypass  bbs_add_fav"); // add fav.
        if(_htmlCode!=null)
            _htmlCode = HTMParser.parseHTM(_htmlCode, getClient().getActiveChar());
//        if(_id.equalsIgnoreCase("101"))
//            getClient().getActiveChar().cleanBypasses(true);
//        _htmlCode = getClient().getActiveChar().encodeBypasses(_htmlCode, true);
       
        if (!_id.equals("1002"))
        {
            // getBytes is a very costly operation, and should only be called once
            byte[] htmlBytes = new byte[0];
            if (_htmlCode != null) {
                htmlBytes = _htmlCode.getBytes();
            }

            byte[] idBytes = _id.getBytes();
            byte data[] = new byte[2 + 2 + 2 + idBytes.length * 2 + 2 * ((_htmlCode != null) ? htmlBytes.length : 0)];
            int i = 0;
            for (int j = 0; j < idBytes.length; j++, i += 2)
            {
                data[i] = idBytes[j];
                data[i + 1] = 0;
            }
            data[i++] = 8;
            data[i++] = 0;

            byte[] html = new byte[0];
            if (_htmlCode != null)
            {
                try
                {
                    html = _htmlCode.getBytes("UTF-16LE");
                }
                catch (UnsupportedEncodingException e)
                {
                    html = new byte[_htmlCode.length() * 2];
                    for (int j = 0; j < htmlBytes.length; i += 2, j++)
                    {
                        data[i] = htmlBytes[j];
                        data[i + 1] = 0;
                    }
                }
            }
            System.arraycopy(html, 0, data, i, html.length);
            i += html.length;

            data[i++] = 0;
            data[i] = 0;
            writeB(data);
        }
        else
        {
            writeB(get1002());
        }
    }

    /* (non-Javadoc)
     * @see ru.catssoftware.gameserver.serverpackets.ServerBasePacket#getType()
     */
    @Override
    public String getType()
    {
        return _S__6E_SHOWBOARD;
    }
}
О каком огрызке ты говоришь если это ShowBoard, ни какого пакета HideBoard нет. Зачем ты вообще activeChar.sendPacket(new HideBoard()); это запостил ?
 
Назад
Сверху Снизу