Mobius NICK_COLOR

ЕгорСПБ

Знаменитый
Местный
Сообщения
211
Розыгрыши
0
Решения
2
Репутация
10
Реакции
34
Баллы
1 298
Хроники
  1. Master Class
Исходники
Присутствуют
Сборка
L2J_Mobius_12.3_Superion
Всем Привет.
В общем помог человек написал код.
Код:
Java:
package handlers.communityboard.custom;

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

import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.cache.HtmCache;
import org.l2jmobius.gameserver.handler.CommunityBoardHandler;
import org.l2jmobius.gameserver.handler.IParseBoardHandler;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.network.serverpackets.ShowBoard;

public class TitleNameBoard implements IParseBoardHandler {
    private static final String[] COMMANDS = {
            "_bbschangename",
            "_bbschangetitle",
            "_bbschangenamecolor",
            "_bbschangetitlecolor"
    };

    @Override
    public String[] getCommandList() {
        return COMMANDS;
    }

    @Override
    public boolean onCommand(String command, Player player) {
        String lang = player.getLang() != null ? player.getLang() : Config.MULTILANG_DEFAULT;
        String htmlPrefix = lang.equals("en") ? "data/html/" : "data/lang/" + lang + "/data/html/";

        // ---------- Change Name ----------
        if (command.equals("_bbschangename")) {
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changename.html");
            return true;
        } else if (command.startsWith("_bbschangename ")) {
            String newName = command.substring(15).trim();
            if (newName.isEmpty()) { player.sendMessage("Enter new name."); return false; }
            if (newName.length() < 3 || newName.length() > 16) { player.sendMessage("Name must be 3-16 characters."); return false; }
            if (isNameTaken(newName, player.getObjectId())) { player.sendMessage("Name already taken."); return false; }

            if (updateNameInDatabase(player.getObjectId(), newName)) {
                player.setName(newName);
                player.broadcastUserInfo();
                player.sendMessage("Your name has been changed to " + newName + ".");
            } else {
                player.sendMessage("Error changing name.");
            }
            player.sendPacket(new ShowBoard());
            return true;
        }

        // ---------- Change Title ----------
        if (command.equals("_bbschangetitle")) {
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changetitle.html");
            return true;
        } else if (command.startsWith("_bbschangetitle ")) {
            String newTitle = command.substring(15).trim();
            if (newTitle.length() > 16) { player.sendMessage("Title cannot exceed 16 characters."); return false; }

            if (updateTitleInDatabase(player.getObjectId(), newTitle)) {
                player.setTitle(newTitle);
                player.broadcastUserInfo();
                player.sendMessage("Your title has been changed to: " + newTitle + ".");
            } else {
                player.sendMessage("Error changing title.");
            }
            player.sendPacket(new ShowBoard());
            return true;
        }

        // ---------- Name Color ----------
        if (command.equals("_bbschangenamecolor")) {
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changenamecolor.html");
            return true;
        } else if (command.startsWith("_bbschangenamecolor ")) {
            String colorCode = command.substring(20).trim().replace("#","");
            try {
                int rgb = Integer.parseInt(colorCode, 16);
                int bgr = rgbToBgr(rgb); // конвертируем RGB → BGR
                player.getAppearance().setNameColor(bgr); // клиент видит правильный цвет
                saveColorToDB(player.getObjectId(), bgr, true); // сохраняем в БД
                player.broadcastUserInfo();
            } catch (Exception e) {
                player.sendMessage("Invalid color format.");
            }
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changenamecolor.html");
            return true;
        }

        // ---------- Title Color ----------
        if (command.equals("_bbschangetitlecolor")) {
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changetitlecolor.html");
            return true;
        } else if (command.startsWith("_bbschangetitlecolor ")) {
            String colorCode = command.substring(21).trim().replace("#","");
            try {
                int rgb = Integer.parseInt(colorCode, 16);
                int bgr = rgbToBgr(rgb);
                player.getAppearance().setTitleColor(bgr);
                saveColorToDB(player.getObjectId(), bgr, false);
                player.broadcastUserInfo();
            } catch (Exception e) {
                player.sendMessage("Invalid color format.");
            }
            sendHtml(player, htmlPrefix + "CommunityBoard/custom/services/changetitlecolor.html");
            return true;
        }

        return false;
    }

    private void sendHtml(Player player, String path) {
        String html = HtmCache.getInstance().getHtm(player, path);
        CommunityBoardHandler.separateAndSend(html, player);
    }

    private boolean isNameTaken(String name, int objectId) {
        try (Connection con = DatabaseFactory.getConnection();
             PreparedStatement ps = con.prepareStatement("SELECT charId FROM characters WHERE LOWER(char_name)=LOWER(?) AND charId<>?")) {
            ps.setString(1, name);
            ps.setInt(2, objectId);
            try (ResultSet rs = ps.executeQuery()) { return rs.next(); }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private boolean updateNameInDatabase(int objectId, String newName) {
        try (Connection con = DatabaseFactory.getConnection();
             PreparedStatement ps = con.prepareStatement("UPDATE characters SET char_name=? WHERE charId=?")) {
            ps.setString(1, newName);
            ps.setInt(2, objectId);
            return ps.executeUpdate() > 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private boolean updateTitleInDatabase(int objectId, String newTitle) {
        try (Connection con = DatabaseFactory.getConnection();
             PreparedStatement ps = con.prepareStatement("UPDATE characters SET title=? WHERE charId=?")) {
            ps.setString(1, newTitle);
            ps.setInt(2, objectId);
            return ps.executeUpdate() > 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private void saveColorToDB(int objectId, int bgr, boolean isName) {
        String column = isName ? "name_color" : "title_color";
        try (Connection con = DatabaseFactory.getConnection();
             PreparedStatement ps = con.prepareStatement("UPDATE characters SET " + column + "=? WHERE charId=?")) {
            ps.setInt(1, bgr);
            ps.setInt(2, objectId);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private int rgbToBgr(int rgb) {
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = rgb & 0xFF;
        return (b << 16) | (g << 8) | r;
    }
}
Спасибо ему огромное.
Я закинул файл ColorChangeBoard.java по пути / / / / /
Потом скомпилировал сборку.
Все прошло без ошибок.
В комюнити в ini прописал
Код:
# Enable/Disable nickname/title color change service
ColorChangeService = true

 # Item ID used for payment
ColorChangeItemId = 57

# Amount of item required
ColorChangeItemAmount = 1000

ColorChangeColors = 00FF00,FF9900,000000,00FFFF,000080,87CEFA,98FF98,808080,FFFF00,FFC0CB

ColorChangeColorNames = Зелёный,Оранжевый,Чёрный,Бирюзовый,Темно-синий,Голубой,Мятный,Серый,Жёлтый,Розовый
Так же добавил в navigation.html
Код:
<tr>
    <td><button value="ColorChange" action="bypass _bbcolorchange" width=200 height=30 back="L2UI_CT1.OlympiadWnd_DF_Reward_Down" fore="L2UI_CT1.OlympiadWnd_DF_Reward"></td>
</tr>
Но что то еще нужно сделать а я не понимаю
[Character: ad[268513734] - Account: ad - IP: 127.0.0.1] sent not handled RequestBypassToServer: [_bbcolorchange]
Прошу помощи или указать на ошибку.
Вообще в ту сторону двигаю?
 
пропиши хандлер саму команду, у тебя она не прописана
 
пропиши хандлер саму команду, у тебя она не прописана
так у него там тупо опечатка - вместо "_bbschangetitlecolor" или "_bbschangenamecolor" в хтмл "_bbcolorchange"

З.Ы. А так, реализация - полный п...
 
Оверпостинг
Поменял значение
Код:
<tr>
        <td>
            <table width=180>
                <tr>
                    <td align=center>
                        <button value="ColorChange" action="bypass _bbschangenamecolor;colorchange/main.html" width=177 height=33 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
                    </td>
                </tr>
            </table>
        </td>
    </tr>
но все та же ошибка.

Может кто то пошагово объяснить что делать с кодом
Код:
Java:
package handlers.communityboard.custom;

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

import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.cache.HtmCache;
import org.l2jmobius.gameserver.handler.CommunityBoardHandler;
import org.l2jmobius.gameserver.handler.IParseBoardHandler;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.network.serverpackets.ShowBoard;

public class TitleNameBoard implements IParseBoardHandler {
    private static final String[] COMMANDS = {
            "_bbschangename",
            "_bbschangetitle",
            "_bbschangenamecolor",
            "_bbschangetitlecolor"
    };

    @Override
    public String[] getCommandList() {
        return COMMANDS;
    }

    @Override
    public boolean onCommand(String command, Player player) {
        String lang = player.getLang() != null ? player.getLang() : Config.MULTILANG_DEFAULT;
        String htmlPrefix = lang.equals("en") ? "data/html/" : "data/lang/" + lang + "/data/html/";

        // ---------- Change Name ----------
        if (command.equals("_bbschangename")) {
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changename.html");
            return true;
        } else if (command.startsWith("_bbschangename ")) {
            String newName = command.substring(15).trim();
            if (newName.isEmpty()) { player.sendMessage("Enter new name."); return false; }
            if (newName.length() < 3 || newName.length() > 16) { player.sendMessage("Name must be 3-16 characters."); return false; }
            if (isNameTaken(newName, player.getObjectId())) { player.sendMessage("Name already taken."); return false; }

            if (updateNameInDatabase(player.getObjectId(), newName)) {
                player.setName(newName);
                player.broadcastUserInfo();
                player.sendMessage("Your name has been changed to " + newName + ".");
            } else {
                player.sendMessage("Error changing name.");
            }
            player.sendPacket(new ShowBoard());
            return true;
        }

        // ---------- Change Title ----------
        if (command.equals("_bbschangetitle")) {
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changetitle.html");
            return true;
        } else if (command.startsWith("_bbschangetitle ")) {
            String newTitle = command.substring(15).trim();
            if (newTitle.length() > 16) { player.sendMessage("Title cannot exceed 16 characters."); return false; }

            if (updateTitleInDatabase(player.getObjectId(), newTitle)) {
                player.setTitle(newTitle);
                player.broadcastUserInfo();
                player.sendMessage("Your title has been changed to: " + newTitle + ".");
            } else {
                player.sendMessage("Error changing title.");
            }
            player.sendPacket(new ShowBoard());
            return true;
        }

        // ---------- Name Color ----------
        if (command.equals("_bbschangenamecolor")) {
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changenamecolor.html");
            return true;
        } else if (command.startsWith("_bbschangenamecolor ")) {
            String colorCode = command.substring(20).trim().replace("#","");
            try {
                int rgb = Integer.parseInt(colorCode, 16);
                int bgr = rgbToBgr(rgb); // конвертируем RGB → BGR
                player.getAppearance().setNameColor(bgr); // клиент видит правильный цвет
                saveColorToDB(player.getObjectId(), bgr, true); // сохраняем в БД
                player.broadcastUserInfo();
            } catch (Exception e) {
                player.sendMessage("Invalid color format.");
            }
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changenamecolor.html");
            return true;
        }

        // ---------- Title Color ----------
        if (command.equals("_bbschangetitlecolor")) {
            sendHtml(player, htmlPrefix + "CommunityBoard/Custom/services/changetitlecolor.html");
            return true;
        } else if (command.startsWith("_bbschangetitlecolor ")) {
            String colorCode = command.substring(21).trim().replace("#","");
            try {
                int rgb = Integer.parseInt(colorCode, 16);
                int bgr = rgbToBgr(rgb);
                player.getAppearance().setTitleColor(bgr);
                saveColorToDB(player.getObjectId(), bgr, false);
                player.broadcastUserInfo();
            } catch (Exception e) {
                player.sendMessage("Invalid color format.");
            }
            sendHtml(player, htmlPrefix + "CommunityBoard/custom/services/changetitlecolor.html");
            return true;
        }

        return false;
    }

    private void sendHtml(Player player, String path) {
        String html = HtmCache.getInstance().getHtm(player, path);
        CommunityBoardHandler.separateAndSend(html, player);
    }

    private boolean isNameTaken(String name, int objectId) {
        try (Connection con = DatabaseFactory.getConnection();
             PreparedStatement ps = con.prepareStatement("SELECT charId FROM characters WHERE LOWER(char_name)=LOWER(?) AND charId<>?")) {
            ps.setString(1, name);
            ps.setInt(2, objectId);
            try (ResultSet rs = ps.executeQuery()) { return rs.next(); }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private boolean updateNameInDatabase(int objectId, String newName) {
        try (Connection con = DatabaseFactory.getConnection();
             PreparedStatement ps = con.prepareStatement("UPDATE characters SET char_name=? WHERE charId=?")) {
            ps.setString(1, newName);
            ps.setInt(2, objectId);
            return ps.executeUpdate() > 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private boolean updateTitleInDatabase(int objectId, String newTitle) {
        try (Connection con = DatabaseFactory.getConnection();
             PreparedStatement ps = con.prepareStatement("UPDATE characters SET title=? WHERE charId=?")) {
            ps.setString(1, newTitle);
            ps.setInt(2, objectId);
            return ps.executeUpdate() > 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private void saveColorToDB(int objectId, int bgr, boolean isName) {
        String column = isName ? "name_color" : "title_color";
        try (Connection con = DatabaseFactory.getConnection();
             PreparedStatement ps = con.prepareStatement("UPDATE characters SET " + column + "=? WHERE charId=?")) {
            ps.setInt(1, bgr);
            ps.setInt(2, objectId);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private int rgbToBgr(int rgb) {
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = rgb & 0xFF;
        return (b << 16) | (g << 8) | r;
    }
}
 
Последнее редактирование модератором:
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…