Warframe 67 Опубликовано 20 июля, 2013 Bug Report NPC для L2JFrozen, для других сборок/хроник переписать не составит труда. Описание: NPC, при обращении открывается диалоговое окно с возможностью указать баг, который вы нашли в игре. Удобно для администрации и игроков - не нужно писать на форуме. Установка: Создаем класс вот здесь: com.l2jfrozen.gameserver.model.actor.instance Даем ему название: L2BugReportInstance.java И копируем туда данный код: /* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package com.l2jfrozen.gameserver.model.actor.instance; import java.io.*; import java.util.StringTokenizer; import javolution.text.TextBuilder; import com.l2jfrozen.gameserver.ai.CtrlIntention; import com.l2jfrozen.gameserver.model.L2World; import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance; import com.l2jfrozen.gameserver.network.L2GameClient; import com.l2jfrozen.gameserver.network.clientpackets.Say2; import com.l2jfrozen.gameserver.network.serverpackets.ActionFailed; import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay; import com.l2jfrozen.gameserver.network.serverpackets.MyTargetSelected; import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jfrozen.gameserver.network.serverpackets.ValidateLocation; import com.l2jfrozen.gameserver.templates.L2NpcTemplate; /** * @author squallcs * */ public class L2BugReportInstance extends L2FolkInstance { private static String _type; public L2BugReportInstance(int objectId, L2NpcTemplate template) { super(objectId, template); } @Override public void onBypassFeedback(L2PcInstance player, String command) { if (command.startsWith("send_report")) { StringTokenizer st = new StringTokenizer(command); st.nextToken(); String msg = null; String type = null; type = st.nextToken(); msg = st.nextToken(); try { while (st.hasMoreTokens()) { msg = msg + " " + st.nextToken(); } sendReport(player, type, msg); } catch (StringIndexOutOfBoundsException e) { } } } static { new File("log/BugReports/").mkdirs(); } private void sendReport(L2PcInstance player, String command, String msg) { String type = command; L2GameClient info = player.getClient().getConnection().getClient(); if (type.equals("General")) _type = "General"; if (type.equals("Fatal")) _type = "Fatal"; if (type.equals("Misuse")) _type = "Misuse"; if (type.equals("Balance")) _type = "Balance"; if (type.equals("Other")) _type = "Other"; try { String fname = "log/BugReports/" + player.getName() + ".txt"; File file = new File(fname); boolean exist = file.createNewFile(); if (!exist) { player.sendMessage("You have already sent a bug report, GMs must check it first."); return; } FileWriter fstream = new FileWriter(fname); BufferedWriter out = new BufferedWriter(fstream); out.write("Character Info: " + info + "\r\nBug Type: " + _type + "\r\nMessage: " + msg); player.sendMessage("Report sent. GMs will check it soon. Thanks..."); for (L2PcInstance allgms : L2World.getInstance().getAllGMs()) allgms.sendPacket(new CreatureSay(0, Say2.SHOUT, "Bug Report Manager", player.getName() + " sent a bug report.")); System.out.println("Character: " + player.getName() + " sent a bug report."); out.close(); } catch (Exception e) { player.sendMessage("Something went wrong try again."); } } @Override public void onAction(L2PcInstance player) { if (!canTarget(player)) { return; } if (this != player.getTarget()) { player.setTarget(this); player.sendPacket(new MyTargetSelected(getObjectId(), 0)); player.sendPacket(new ValidateLocation(this)); } else if (!canInteract(player)) { player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this); } else { showHtmlWindow(player); } player.sendPacket(new ActionFailed()); } private void showHtmlWindow(L2PcInstance activeChar) { NpcHtmlMessage nhm = new NpcHtmlMessage(5); TextBuilder replyMSG = new TextBuilder(""); replyMSG.append("<html><title>Bug Report Manager</title>"); replyMSG.append("<body><br><br><center>"); replyMSG.append("<table border=0 height=10 bgcolor=\"444444\" width=240>"); replyMSG.append("<tr><td align=center><font color=\"00FFFF\">Hello " + activeChar.getName() + ".</font></td></tr>"); replyMSG.append("<tr><td align=center><font color=\"00FFFF\">There are no Gms online</font></td></tr>"); replyMSG.append("<tr><td align=center><font color=\"00FFFF\">and you want to report something?</font></td></tr>"); replyMSG.append("</table><br>"); replyMSG.append("<img src=\"L2UI.SquareWhite\" width=280 height=1><br><br>"); replyMSG.append("<table width=250><tr>"); replyMSG.append("<td><font color=\"LEVEL\">Select Report Type:</font></td>"); replyMSG.append("<td><combobox width=105 var=type list=General;Fatal;Misuse;Balance;Other></td>"); replyMSG.append("</tr></table><br><br>"); replyMSG.append("<multiedit var=\"msg\" width=250 height=50><br>"); replyMSG.append("<br><img src=\"L2UI.SquareWhite\" width=280 height=1><br><br><br><br><br><br><br>"); replyMSG.append("<button value=\"Send Report\" action=\"bypass -h npc_" + getObjectId() + "_send_report $type $msg\" width=204 height=20 back=\"sek.cbui75\" fore=\"sek.cbui75\">"); replyMSG.append("</center></body></html>"); nhm.setHtml(replyMSG.toString()); activeChar.sendPacket(nhm); activeChar.sendPacket(new ActionFailed()); } } Создаем NPC с любым id и типом L2BugReport. Баг репорты игроков сохраняются здесь: /gameserver/logs/BugReport Credits: sQuaLL (From L2jFrozen Forum) 8 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
sharp1k 321 Опубликовано 20 июля, 2013 полезно ) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Warframe 67 Опубликовано 20 июля, 2013 полезно ) Очень удобно, плюс есть категории багов, игрок при написании своего баг репорта может указать, к чему относится данная недоработка. (General;Fatal;Misuse;Balance;Other) 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Warframe 67 Опубликовано 20 июля, 2013 Сделал как на данной картинке: private void showHtmlWindow(L2PcInstance activeChar) { NpcHtmlMessage nhm = new NpcHtmlMessage(5); TextBuilder replyMSG = new TextBuilder(""); replyMSG.append("<html><title>Баг Репорт Менеджер</title>"); replyMSG.append("<body><br><br><center>"); replyMSG.append("<table border=0 height=10 bgcolor=\"444444\" width=240>"); replyMSG.append("<tr><td align=center><font color=\"00FFFF\">Здравствуйте " + activeChar.getName() + ".</font></td></tr>"); replyMSG.append("<tr><td align=center><font color=\"00FFFF\">Нету Админов в онлайне</font></td></tr>"); replyMSG.append("<tr><td align=center><font color=\"00FFFF\">и Вы знаете баг?</font></td></tr>"); replyMSG.append("</table><br>"); replyMSG.append("<img src=\"L2UI.SquareWhite\" width=280 height=1><br><br>"); replyMSG.append("<table width=250><tr>"); replyMSG.append("<td><font color=\"LEVEL\">Выберите тип репорта:</font></td>"); replyMSG.append("<td><combobox width=105 var=type list=Общий;Критический;Дюпы;Баланс;Другое></td>"); replyMSG.append("</tr></table><br><br>"); replyMSG.append("<multiedit var=\"msg\" width=250 height=50><br>"); replyMSG.append("<br><img src=\"L2UI.SquareWhite\" width=280 height=1><br><br><br><br><br><br><br>"); replyMSG.append("<button value=\"Передать Репорт\" action=\"bypass -h npc_" + getObjectId() + "_send_report $type $msg\" width=204 height=20 back=\"sek.cbui75\" fore=\"sek.cbui75\">"); replyMSG.append("</center></body></html>"); nhm.setHtml(replyMSG.toString()); activeChar.sendPacket(nhm); activeChar.sendPacket(new ActionFailed()); } При русификации данного места: var=type list=Общий;Критический;Дюпы;Баланс;Другое , не забываем про: if (type.equals("General")) _type = "General"; if (type.equals("Fatal")) _type = "Fatal"; if (type.equals("Misuse")) _type = "Misuse"; if (type.equals("Balance")) _type = "Balance"; if (type.equals("Other")) _type = "Other"; Всем спасибо за внимание! 3 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
IamAdmin 5 Опубликовано 20 июля, 2013 Спасибо, интересная вещь. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 20 июля, 2013 А чем петиции не устраивают? И я думаю админу каждый раз смотреть что там создало не в кайф Форум по практичнее Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Warframe 67 Опубликовано 20 июля, 2013 А чем петиции не устраивают? И я думаю админу каждый раз смотреть что там создало не в кайф Форум по практичнее Вполне удобно один раз в день зайти и скачать папку с баг репортами, чем следить за каждым сообщением на форуме, тем более игрокам свойственно флудить. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Ingatello 129 Опубликовано 20 июля, 2013 Прикольно) спасибо тебе Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vyshky1994 0 Опубликовано 20 июля, 2013 можно как-то защитить от спама? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Demoncool 1110 Опубликовано 20 июля, 2013 Больше 1-го репорта не отправить. Пока админ не проверит 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Warframe 67 Опубликовано 20 июля, 2013 (изменено) можно как-то защитить от спама? Можно сделать ограничения на отправку баг репорта. Допустим: с одного IP/HWID дать возможность писать всего 3 раза в день. А так, на данный момент, ограничения в одно сообщение до отправки администрацией (в целях защиты от спама). Изменено 20 июля, 2013 пользователем Warframe 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LionKnight 62 Опубликовано 20 июля, 2013 (изменено) Как сделать что бы в игре сообщение в баг репорт! можно было писать по русски?? Изменено 20 июля, 2013 пользователем LionKnight Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Russian 49 Опубликовано 21 июля, 2013 Неплохо. Спасибо за идею, дам своему кодеру эту же идею, пускай делает для хф мне =) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DreamBoss 12 Опубликовано 25 июля, 2013 (изменено) замечательная идея, да и реализация нормальная. ТС не будет против если я возьму за основу, и интегрирую в сборку эту фишку? Немного изменю, можно сделать связь с форумом )) и постить туда сразу... Конечно с Вашим авторством... Изменено 25 июля, 2013 пользователем DreamBoss Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
RoyalGost 277 Опубликовано 25 июля, 2013 ТС врятли будет против, т.к. данный функционал лежит в шаре на забугорских проектах уже больше 3 месяцев... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Demoncool 1110 Опубликовано 25 июля, 2013 замечательная идея, да и реализация нормальная. ТС не будет против если я возьму за основу, и интегрирую в сборку эту фишку? Немного изменю, можно сделать связь с форумом )) и постить туда сразу... Конечно с Вашим авторством... Автор наработки не ТС Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DreamBoss 12 Опубликовано 25 июля, 2013 Автор наработки не ТС Да уже увидел... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
SmokiMo 892 Опубликовано 25 августа, 2013 Автоматическое сообщение Эта тема была перемещена из "Дополнения" в "Серверные". 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
evolus 53 Опубликовано 4 сентября, 2013 Установка: Создаем класс вот здесь: com.l2jfrozen.gameserver.model.actor.instance Не могу разобраться с этим пунктом Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
yokki 2 Опубликовано 1 октября, 2013 Как сделать что бы в игре сообщение в баг репорт! можно было писать по русски?? нужно выполнить следующие танцы с бубном: из этого replyMSG.append("<myltiedit var=\"msg\" width=250 height=50><br>"); сделать это replyMSG.append("<edit var=\"msg\" width=250 height=50><br>"); кто внимателен поймет) ну а если помог?! ТЫ ЗНАЕШЬ ЧТО ДЕЛАТЬ 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
yokki 2 Опубликовано 1 октября, 2013 (изменено) Установка: Создаем класс вот здесь: com.l2jfrozen.gameserver.model.actor.instance Не могу разобраться с этим пунктом это путь com/l2jfrozen/gameserver/model/actor/instance [.=/] Изменено 1 октября, 2013 пользователем yokki 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pww 8 Опубликовано 31 января, 2014 нужно выполнить следующие танцы с бубном: из этого replyMSG.append("<myltiedit var=\"msg\" width=250 height=50><br>"); сделать это replyMSG.append("<edit var=\"msg\" width=250 height=50><br>"); кто внимателен поймет) ну а если помог?! ТЫ ЗНАЕШЬ ЧТО ДЕЛАТЬ Можешь скинуть исправленный класс? Дам пару плюсов Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты