Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Оброботчики
#11
зачем писать целый класс, если можно обойтись парой строк кода в RequestBypassToServer?
Ответ
#12
linliss Написал:зачем писать целый класс, если можно обойтись парой строк кода в RequestBypassToServer?
За тем, что порядок в больших проектах прежде всего!
Ответ
#13
Старенькая тема, ну да ладно.
Хочу прикрутить хендлер к EmuRT, сам хендлер стащил с ла2вт...
Весь код
Код:
package handlers.bypasshandlers;

import com.l2dc.gameserver.handler.IBypassHandler;
import com.l2dc.gameserver.model.L2Multisell;
import com.l2dc.gameserver.model.actor.L2Character;
import com.l2dc.gameserver.model.actor.L2Npc;
import com.l2dc.gameserver.model.actor.instance.L2PcInstance;

public class Multisell implements IBypassHandler
{
    private static final String[] COMMANDS =
    {
        "multisell",
        "exc_multisell"
    };

    public boolean useBypass(String command, L2PcInstance activeChar, L2Character target)
    {
        if (!(target instanceof L2Npc))
            return false;
        
        if (!activeChar.validateBypass(command))
            return false;

        try
        {
            activeChar.setIsUsingAIOItemMultisell(false);
            
            int listId;
            if (command.startsWith(COMMANDS[0])) // multisell
            {
                listId = Integer.parseInt(command.substring(9).trim());
                L2Multisell.getInstance().separateAndSend(listId, activeChar, ((L2Npc)target).getNpcId(), false, ((L2Npc)target).getCastle().getTaxRate());
            }
            else
            {
                listId = Integer.parseInt(command.substring(13).trim());
                L2Multisell.getInstance().separateAndSend(listId, activeChar, ((L2Npc)target).getNpcId(), true, ((L2Npc)target).getCastle().getTaxRate());
            }
            return true;
        }
        catch (Exception e)
        {
            _log.info("Exception in " + getClass().getSimpleName());
        }
        return false;
    }

    public String[] getBypassList()
    {
        return COMMANDS;
    }
}
Но беда в том, что он не хочет на EmuRT пахать ( Хотя такие обработчики как телепорт
Код:
//custom_scripts.cfg
//custom/PVPCB/TeleportBBSManager.java
//bypass -h _bbsteleto 50192
//50192 id телепорта в custom_teleport

package custom.PVPCB;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javolution.text.TextBuilder;
import net.l2emuproject.L2DatabaseFactory;
import net.l2emuproject.gameserver.cache.HtmCache;
import net.l2emuproject.gameserver.communitybbs.CommunityBoard;
import net.l2emuproject.gameserver.communitybbs.IBBSHandler;
import net.l2emuproject.gameserver.communitybbs.Manager.BaseBBSManager;
import net.l2emuproject.gameserver.datatables.TeleportLocationTable;
import net.l2emuproject.gameserver.instancemanager.SiegeManager;
import net.l2emuproject.gameserver.instancemanager.TownManager;
import net.l2emuproject.gameserver.model.L2TeleportLocation;
import net.l2emuproject.gameserver.model.actor.instance.L2PcInstance;
import net.l2emuproject.gameserver.model.olympiad.Olympiad;
import net.l2emuproject.gameserver.network.SystemMessageId;

public class TeleportBBSManager extends BaseBBSManager implements IBBSHandler
{

    @Override
    public String getBoard()
    {
        return "101";
    }

    private static String[] _COMMANDS = { "tele", "teleto", "telesave", "teledel", "telegomy" };

    @Override
    public String[] getCommands()
    {
        return _COMMANDS;
    }

    public class CBteleport
    {
        public int TpId = 0; // Teport loc ID
        public String TpName = ""; // Loc name
        public int PlayerId = 0; // charID
        public int xC = 0; // Location coords
        public int yC = 0; //
        public int zC = 0; //
    }

    @Override
    public String handleCommand(L2PcInstance player, String command, String param)
    {

        if(command.equals("tele"))
        {
            showTp(player);
        }
        if(command.equals("telesave"))
        {
            String TpNameAdd = param;
            AddTp(player, TpNameAdd);
            showTp(player);
        }
        else if(command.equals("teledel"))
        {
            int TpNameDell = Integer.parseInt(param);
            delTp(player, TpNameDell);
            showTp(player);
        }
        else if(command.equals("telegomy"))
        {
            int TpToGo = Integer.parseInt(param);
            goTp(player, TpToGo);
            showTp(player);
        }
        if(command.equals("teleto"))
        {
            if(player != null)
            {
                if(player.isInCombat())
                {
                    player.sendMessage("Телепортация в режиме боя запрещена.");
                    return null;
                }
                if(player.isSitting())
                {
                    player.sendMessage("Телепортация сидя запрещена.");
                    return null;
                }
                if(player.isChaotic())
                {
                    player.sendMessage("Телепортация в режиме PK запрещена.");
                    return null;
                }
                if(player.isInOlympiadMode() || Olympiad.getInstance().isRegistered(player) || player.getOlympiadGameId() != -1)
                {
                    player.sendMessage("Данное действие запрещенно на олимпе.");
                    return null;
                }
                if(player.isInFunEvent())
                {
                    player.sendMessage("Данное действие запрещенно во время Эвента.");
                    return null;
                }
                if(player.isInJail())
                {
                    player.sendMessage("Данное действие запрещенно в Тюрьме.");
                    return null;
                }
                if(player.isInKarteiCube())
                {
                    player.sendMessage("Данное действие запрещенно в KarteiCube.");
                    return null;
                }
                if(player.isInUndergroundColiseum())
                {
                    player.sendMessage("Данное действие запрещенно в Underground Coliseum.");
                    return null;
                }

                if(player.isFlying())
                {
                    player.sendMessage("Во время полёта телепортация запрещена.");
                    return null;
                }
                if(player.getInstanceId() > 0)
                {
                    player.sendMessage("Телепорт из Инстанта запрещён.");
                }
                //#######

                L2TeleportLocation clist = TeleportLocationTable.getInstance().getCustomTemplate(Integer.parseInt(param));
                int price = clist.getPrice();

                if(SiegeManager.getInstance().checkIfInZone(clist.getLocX(), clist.getLocY(), clist.getLocZ()))
                {
                    player.sendMessage("Телепортация к осаждаемому замку запрещена.");
                    return null;
                }
                if(TownManager.getInstance().townHasCastleInSiege(clist.getLocX(), clist.getLocY(), clist.getLocZ()))
                {
                    player.sendMessage("Телепортация в осаждаемый город запрещена.");
                    return null;
                }

                if(price > 0 && player.getAdena() < price)
                {
                    player.sendMessage("Не хватает адены.");
                    return null;
                }

                if(price > 0)
                    player.destroyItemByItemId("BBSGK", 57, price, null, true);

                player.teleToLocation(clist.getLocX(), clist.getLocY(), clist.getLocZ());
                //player.sendMessage("#"+price);
            }
        }
        return null;
    }

    private void showTp(L2PcInstance activeChar)
    {
        CBteleport tp;
        Connection con = null;
        try
        {
            con = L2DatabaseFactory.getInstance().getConnection();
            PreparedStatement st = con.prepareStatement("SELECT * FROM comteleport WHERE charId=?;");
            st.setLong(1, activeChar.getObjectId());
            ResultSet rs = st.executeQuery();
            TextBuilder html = new TextBuilder();
            html.append("<table width=220>");
            while(rs.next())
            {
                tp = new CBteleport();
                tp.TpId = rs.getInt("TpId");
                tp.TpName = rs.getString("name");
                tp.PlayerId = rs.getInt("charId");
                tp.xC = rs.getInt("xPos");
                tp.yC = rs.getInt("yPos");
                tp.zC = rs.getInt("zPos");
                html.append("<tr>");
                html.append("<td>");
                html.append("<button value=\"" + tp.TpName + "\" action=\"bypass -h _bbstelegomy " + tp.TpId + "\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">");
                html.append("</td>");
                html.append("<td>");
                html.append("<button value=\"Удалить\" action=\"bypass -h _bbsteledel " + tp.TpId + "\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">");
                html.append("</td>");
                html.append("</tr>");
            }
            html.append("</table>");

            String content = HtmCache.getInstance().getHtm("data/html/CommunityBoard/50.htm");
            content = content.replace("%tp%", html.toString());
            separateAndSend(content, activeChar);
            return;

        }
        catch(Exception e)
        {}
        finally
        {
            try
            {
                con.close();
            }
            catch(Exception e)
            {}
        }

    }

    private void goTp(L2PcInstance activeChar, int TpToGo)
    {
        int priceTp = 2000000;

        if(activeChar.isDead() || activeChar.isAlikeDead() || activeChar.isCastingNow() || activeChar.isInCombat() || activeChar.isAttackingNow() || activeChar.isInOlympiadMode() || activeChar.isInJail() || activeChar.isFlying())
        {
            activeChar.sendMessage("Телепортация невозможна");
            return;
        }
        if(priceTp > 0 && activeChar.getAdena() < priceTp)
        {
            activeChar.sendPacket(SystemMessageId.YOU_NOT_ENOUGH_ADENA);
            return;
        }

        else
        {
            if(priceTp > 0)
            {
                activeChar.reduceAdena("Teleport", priceTp, activeChar, true);
            }
            CBteleport tp;
            Connection con = null;
            try
            {
                con = L2DatabaseFactory.getInstance().getConnection();
                PreparedStatement st = con.prepareStatement("SELECT * FROM comteleport WHERE TpId=?;");
                st.setInt(1, TpToGo);
                ResultSet rs = st.executeQuery();
                while(rs.next())
                {

                    tp = new CBteleport();
                    tp.TpId = rs.getInt("TpId");
                    tp.TpName = rs.getString("name");
                    tp.PlayerId = rs.getInt("charId");
                    tp.xC = rs.getInt("xPos");
                    tp.yC = rs.getInt("yPos");
                    tp.zC = rs.getInt("zPos");
                    activeChar.teleToLocation(tp.xC, tp.yC, tp.zC);
                }
            }
            catch(Exception e)
            {}
            finally
            {
                try
                {
                    con.close();
                }
                catch(Exception e)
                {}
            }

        }
    }

    private void delTp(L2PcInstance activeChar, int TpNameDell)
    {
        Connection conDel = null;
        try
        {
            conDel = L2DatabaseFactory.getInstance().getConnection();
            PreparedStatement stDel = conDel.prepareStatement("DELETE FROM comteleport WHERE charId=? AND TpId=?;");
            stDel.setInt(1, activeChar.getObjectId());
            stDel.setInt(2, TpNameDell);
            stDel.execute();
        }
        catch(Exception e)
        {}
        finally
        {
            try
            {
                conDel.close();
            }
            catch(Exception e)
            {}
        }

    }

    private void AddTp(L2PcInstance activeChar, String TpNameAdd)
    {
        if(activeChar.isDead() || activeChar.isAlikeDead() || activeChar.isCastingNow() || activeChar.isAttackingNow())
        {
            activeChar.sendMessage("Сохранить закладку в вашем состоянии нельзя");
            return;
        }

        if(activeChar.isInCombat())
        {
            activeChar.sendMessage("Сохранить закладку в режиме боя нельзя");
            return;
        }

        if(TpNameAdd.equals("") || TpNameAdd.equals(null))
        {
            activeChar.sendMessage("Вы не ввели Имя закладки");
            return;
        }
        Connection con = null;
        try
        {
            con = L2DatabaseFactory.getInstance().getConnection();

            PreparedStatement st = con.prepareStatement("SELECT COUNT(*) FROM comteleport WHERE charId=?;");
            st.setLong(1, activeChar.getObjectId());
            ResultSet rs = st.executeQuery();
            rs.next();
            if(rs.getInt(1) <= 9)
            {
                PreparedStatement st1 = con.prepareStatement("SELECT COUNT(*) FROM comteleport WHERE charId=? AND name=?;");
                st1.setLong(1, activeChar.getObjectId());
                st1.setString(2, TpNameAdd);
                ResultSet rs1 = st1.executeQuery();
                rs1.next();
                if(rs1.getInt(1) == 0)
                {
                    PreparedStatement stAdd = con.prepareStatement("INSERT INTO comteleport (charId,xPos,yPos,zPos,name) VALUES(?,?,?,?,?)");
                    stAdd.setInt(1, activeChar.getObjectId());
                    stAdd.setInt(2, activeChar.getX());
                    stAdd.setInt(3, activeChar.getY());
                    stAdd.setInt(4, activeChar.getZ());
                    stAdd.setString(5, TpNameAdd);
                    stAdd.execute();
                }
                else
                {
                    PreparedStatement stAdd = con.prepareStatement("UPDATE comteleport SET xPos=?, yPos=?, zPos=? WHERE charId=? AND name=?;");
                    stAdd.setInt(1, activeChar.getObjectId());
                    stAdd.setInt(2, activeChar.getX());
                    stAdd.setInt(3, activeChar.getY());
                    stAdd.setInt(4, activeChar.getZ());
                    stAdd.setString(5, TpNameAdd);
                    stAdd.execute();
                }
            }
            else
            {
                activeChar.sendMessage("Вы не можете сохранить более 10 закладок");
            }

        }
        catch(Exception e)
        {}
        finally
        {
            try
            {
                con.close();
            }
            catch(Exception e)
            {}
        }
    }

    public static void main(String[] args)
    {
        CommunityBoard.getInstance().registerBBSHandler(new TeleportBBSManager());
    }

    @Override
    public void parsecmd(String arg0, L2PcInstance arg1)
    {}

    @Override
    public void parsewrite(String arg0, String arg1, String arg2, String arg3, String arg4, L2PcInstance arg5)
    {}
}
Или просто класс-мастер работают...
Менял строчки кода на
Код:
package custom.PVPCB;

import net.l2emuproject.gameserver.handler.IBypassHandler;
import net.l2emuproject.gameserver.model.L2Multisell;
import net.l2emuproject.gameserver.model.actor.L2Character;
import net.l2emuproject.gameserver.model.actor.L2Npc;
import net.l2emuproject.gameserver.model.actor.instance.L2PcInstance;

public class Multisell implements IBBSHandler
И последнюю строку на
Код:
public class Multisell extends BaseBBSManager implements IBBSHandler
Но работоспособности так и не добился... объясните мне, нубу, что надо дописать/исправить, что этот обработчик подключить?( И реально ли мне вообще это сделать с минимальными знаниями Java и не большим желанием тратить некие крупные суммы?..
Ошибку кидает вечно одну...
Код:
Error on: D:\Emu RT\gameserver\data\scripts\custom\PVPCB\Multisell.java.error.log
Line: -1 - Column: -1

compilation failed
Строчка 1, столбец 1...
Я, конечно, понимаю, что обработчики для разных сборок и по большому счету мультиселловский надо полностью переписывать, т.к. не сходится с телепортом... (что то по инструкции EmuRT), но можно ли с данным обработчиком что то сделать?
А то на la2vt 1.1.1 оживить комуннити сервер не удалось.

Добавлено через 32 минуты
Попробовал изменить обработчик, чтобы был похож на бафера, например (который тоже почему-то не работает, хотя и подключен)
Код:
package custom.PVPCB;

import java.util.StringTokenizer;

import net.l2emuproject.gameserver.handler.IBypassHandler;
import net.l2emuproject.gameserver.model.L2Multisell;
import net.l2emuproject.gameserver.model.actor.L2Character;
import net.l2emuproject.gameserver.model.actor.L2Npc;
import net.l2emuproject.gameserver.model.actor.instance.L2PcInstance;

public class Multisell implements IBBSHandler
{
        @Override
    public String getBoard()
    {
        return "101";
    }

    private static String[] _COMMANDS = { "multisell", "multisell" };

    @Override
    public String[] getCommands()
    {
        return _COMMANDS;
    }

        @Override
    public boolean useBypass(String command, L2PcInstance activeChar, L2Character target)
    {
        if (!(target instanceof L2Npc))
            return false;
        
        if (!activeChar.validateBypass(command))
            return false;

        try
        {
            activeChar.setIsUsingAIOItemMultisell(false);
            
            int listId;
            if (command.startsWith(COMMANDS[0])) // multisell
            {
                listId = Integer.parseInt(command.substring(9).trim());
                L2Multisell.getInstance().separateAndSend(listId, activeChar, ((L2Npc)target).getNpcId(), false, ((L2Npc)target).getCastle().getTaxRate());
            }
            else
            {
                listId = Integer.parseInt(command.substring(13).trim());
                L2Multisell.getInstance().separateAndSend(listId, activeChar, ((L2Npc)target).getNpcId(), true, ((L2Npc)target).getCastle().getTaxRate());
            }
            return true;
        }

    public static void main(String[] args)
    {
        CommunityBoard.getInstance().registerBBSHandler(new Multisell());
    }
}
Ошибка осталась прежней....
Ответ
#14
Понимаете ли... в EmuRT нет BypassHandler-ов..
Ответ
#15
Но есть handle? Так? Или меня как всегда уносит далеко?)
Я запутался в общем, как всегда) Дабы не тратить много вашего времени (Все равно бесплатно пальцем не ткнете где что исправить) Скажите... что надо прописать в import ?
В одном хандлере нашел строчку
Код:
public String [color=Red]handleCommand[/color](L2PcInstance activeChar, String command, String param)
В дефолтном мультиселловском от ла2вт подобная строка выглядит
Код:
public boolean [color=Red]useBypass[/color](String command, L2PcInstance activeChar, L2Character target)
У меня ошибка типа такой?
Ответ
#16
Может вы сначала расскаже что же хотите получить в итоге? Smile
Ответ
#17
В наличии шара коммунити заточенная под EmuRT) В ней работает все, кроме бафера и гмшопа) Посмотрев хтмлки от гмшопа, выяснил, что команда типа "action="bypass -h _bbsgmshop multisell 90090" не работает... в конечном итоге я, скачав сборку ла2вт, наткнулся на огромную папку с хендлерами и увидев там хендлер мультиселла сразу захотел воодушевить гмшоп в коммунити, чтобы воспринимал команды типа "action="bypass -h _bbsmultisell;90090", для этого решил подогнать данный обработчик и дело встало )
В данный момент, после всяческой корректировки данного хандлера имею такое
Код:
package custom.PVPCB;

import net.l2emuproject.gameserver.handler.IBBSHandler;
import net.l2emuproject.gameserver.model.L2Multisell;
import net.l2emuproject.gameserver.model.actor.L2Character;
import net.l2emuproject.gameserver.model.actor.L2Npc;
import net.l2emuproject.gameserver.model.actor.instance.L2PcInstance;

public class Multisell implements IBBSHandler
{
        @Override
    public String getBoard()
    {
        return "101";
    }

    private static String[] _COMMANDS = { "multisell", "exc_multisell" };

    @Override
    public String[] getCommands()
    {
        return _COMMANDS;
    }

        @Override
    public String handleCommand(L2PcInstance activeChar, String command, String param)
    {
        if (!(target instanceof L2Npc))
            return false;
        
        if (!activeChar.validatehandle(command))
            return false;

        try
        {
            activeChar.setIsUsingAIOItemMultisell(false);
            
            int listId;
            if (command.startsWith(COMMANDS[0])) // multisell
            {
                listId = Integer.parseInt(command.substring(9).trim());
                L2Multisell.getInstance().separateAndSend(listId, activeChar, ((L2Npc)target).getNpcId(), false, ((L2Npc)target).getCastle().getTaxRate());
            }
            else
            {
                listId = Integer.parseInt(command.substring(13).trim());
                L2Multisell.getInstance().separateAndSend(listId, activeChar, ((L2Npc)target).getNpcId(), true, ((L2Npc)target).getCastle().getTaxRate());
            }
            return true;
        }

    public static void main(String[] args)
    {
        CommunityBoard.getInstance().registerBBSHandler(new Multisell());
    }
}
И вроде бы уже Bypaas сменил полностью на строчку с handleCommands, но ошибка до сих пор повторяется...
Что хочу получить в итоге... Чтобы ГМшоп в коммунити "проглатывал" команды multisell и открывал листы мультиселла )
Ответ
#18
А не рпботает он у вас по очень простой причине. У вас куплена поддержка расширенной CommunityBoard?
Если нет, или шарная сборка, то даже и не пытайтесь
А то что ошибочка, так откройте лог-файл и почитайте
Ответ
#19
Да) Сборка шарная) И коммунити тоже) Значит буду по старинке через нпц) А почему тогда работает телепорт и класс мастер? Это вроде как "не расширенная" коммунити?) И еще... Не подскажете какую нибудь шарную или бесплатную сборочку в которой практикуется коммунити? Можно даже рабочую (по квестам) на 20-40%) т.к сервер пока ставлю только для себя, возможно для пары друзей) И покупать реально рабочие сборки за 3-40к и более совсем не разумно) Пока практикуюсь... Может в будущем рискну на какой нибудь масштабный проэкт.

Добавлено через 58 минут
По поводу ошибки... Уже говорил: Ошибка постоянно одна и та же
Код:
Error on: D:\Emu RT\gameserver\data\scripts\custom\PVPCB\Multisell.java.error.log
Line: -1 - Column: -1

compilation failed
Я так понимаю проблема в импортах.... Я где то что то написал с ошибкой, но не могу понять где (
Ответ
#20
Askord Написал:Да) Сборка шарная) И коммунити тоже) Значит буду по старинке через нпц) А почему тогда работает телепорт и класс мастер? Это вроде как "не расширенная" коммунити?) И еще... Не подскажете какую нибудь шарную или бесплатную сборочку в которой практикуется коммунити? Можно даже рабочую (по квестам) на 20-40%) т.к сервер пока ставлю только для себя, возможно для пары друзей) И покупать реально рабочие сборки за 3-40к и более совсем не разумно) Пока практикуюсь... Может в будущем рискну на какой нибудь масштабный проэкт.

Добавлено через 58 минут
По поводу ошибки... Уже говорил: Ошибка постоянно одна и та же
Код:
Error on: D:\Emu RT\gameserver\data\scripts\custom\PVPCB\Multisell.java.error.log
Line: -1 - Column: -1

compilation failed
Я так понимаю проблема в импортах.... Я где то что то написал с ошибкой, но не могу понять где (

а слабо лог файл открыть? Multisell.java.error.log
Ответ


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


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