Jump to content

advanced

User
  • Content Count

    4
  • Joined

  • Last visited

  • Feedback

    0%

Community Reputation

0

About advanced

  • Rank
    Только пришел

Recent Profile Visitors

564 profile views
  1. advanced

    GHTWEB 5.1.3

    А что с привязкой к личному кабинету уже существующих аккаунтов?
  2. advanced

    GHTWEB 5.1.3

    Наверное, ни для кого не секрет, что разработчики закрыли проект GHTWEB и выложили исходный код последней версии на гитхаб, что позволяет любому желающему невозбранно его скачать и использовать в личных целях. Так я и поступил, потому что давно хотел сменить обвязку. С настройкой и подключением к тестовой базе сервера проблем не возникло, но осталось парочка вопросов: - ЦМС нормально так тормозит. При включенном режиме разработчика, когда внизу страницы показываются SQL-запросы, самый долгий из них занимает 0.05 мс, но в целом загрузка страницы занимает от 8 до 19 секунд. То есть 8-19 секунд ничего не происходит, после чего страница быстро отображается, причем это не зависит от того, добавлены ли ГС и ЛС и активированы ли они в админке. - заявлено, что ЦМС должна автоматически притягивать существующие на сервере аккаунты. Однако, я не понял механизм. Новый аккаунт регистрируется без каких-либо проблем, то есть зарегистрированный на сайте логин-пароль используется для входа в игру. При попытке на сайте ввести логин-пароль уже существующей учетки ЦМС ругается, что такой учетной записи нет, при попытке зарегистрироваться уже с существующим на сервере аккаунтом ЦМС говорит, что такой аккаунт уже есть и не регистрирует его. - нигде не обозначены требования хостинга для этой версии, сайт и форум GHTWEB, соответственно, уже давно лежат. Нет никакой документации, если у кого-то что-то сохранилось, прошу поделиться. Кто сталкивался с указанными проблемами? Возможео, есть еще что-то что прошло мимо меня? Предлагаю поделиться опытом и обсудить.
  3. Доброго времени суток, друзья. Имеется такой странный глюк: при внезапном падении сервера или обрыве соединения (как на стороне сервера, так и на стороне клиента) в клиенте не появляется сообщение "Связь с сервером потеряна -> ОК". То есть окно (окна) клиента остается открытым, но персонаж, естественно, не реагирует. На стороне юзера это выглядит как непонятно что, так как сообщения о разрыве/дисконнекте он не видит. При этом иногда, если сразу после дисконнекта поклацать мышкой для перемещения персонажа или попытаться воспроизвести персонажем любые другие действия, клиент игры "понимает" что он отключился и выдает сообщение, но если окно клиента висит в фоне или в данный момент просто не активно, это сообщение не появится никогда и выйти из клиента можно только прибив процесс в диспетчере задач. Самое странное, что в таком случае персонаж может остаться на сервере и быть совершенно беззащитным перед агрессивными мобами или ПК. Причем стоять персонаж так будет до тех пор, пока его не кикнуть админом или не бросить сервер в ребут. Подскажите, пожалуйста, кто сталкивался с таким, как лечили? Или подкиньте мыслей, что это может быть? Мои соображения: кривой патч, кривое срабатывание какого-то из элементов защиты. Сборка: на основе люцеры 1.7 с котами + небольшие фиксы, насколько я понимаю, от lasteam. Техническая часть: Win7 Pro x86, Core2Duo 3.4 MGz, 3 Gb RAM, 100 Mbit/s канал связи, оптика. На машине ничего, кроме ОС сервера la2 и MySQL не крутится, сервер доступен публично, сайта нет, играем только друзьями-знакомыми. Дополнительно: конфиг с фантомами не работает, оффлайн трейдеров при внезапном падении не сохраняет (при выключении/перезагрузке ГМом сохраняет), может, была у кого такая.
  4. Можно подробнее, нужен именно такой результат, но не могу разобраться. Шифрование и прочее не нужны. Вот код classmaster.java при котором баг воспроизводится: package handlers.voice; import javolution.text.TextBuilder; import ru.catssoftware.Config; import ru.catssoftware.gameserver.communitybbs.CommunityBoard; import ru.catssoftware.gameserver.communitybbs.IBBSHandler; import ru.catssoftware.gameserver.datatables.CharTemplateTable; import ru.catssoftware.gameserver.datatables.ItemTable; import ru.catssoftware.gameserver.handler.IVoicedCommandHandler; import ru.catssoftware.gameserver.handler.VoicedCommandHandler; import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance; import ru.catssoftware.gameserver.model.base.ClassId; import ru.catssoftware.gameserver.model.olympiad.Olympiad; import ru.catssoftware.gameserver.network.SystemMessageId; import ru.catssoftware.gameserver.network.serverpackets.NpcHtmlMessage; import ru.catssoftware.gameserver.network.serverpackets.SystemMessage; public class ClassMaster implements IVoicedCommandHandler,IBBSHandler { private static final String NOT_ALLOWED = "<html><body><br><br><center>Not allowed now</center></body></html>"; public ClassMaster() { VoicedCommandHandler.getInstance()._classMasterHandler = this; } @Override public String getDescription(String command) { return "Вызов диалога классмастера"; } @Override public String[] getVoicedCommandList() { return new String[] {"classmaster"}; } @Override public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target) { NpcHtmlMessage msg = new NpcHtmlMessage(0); try { Integer.parseInt(target); } catch(NumberFormatException e) { target = null; } msg.setHtml(process(activeChar, target,false)); activeChar.sendPacket(msg); return false; } public String process(L2PcInstance player, String args, boolean isBBS) { if (player._event!=null || Olympiad.getInstance().isRegistered(player) || Olympiad.getInstance().isRegisteredInComp(player)) { return NOT_ALLOWED; } if(args==null || args.length()==0) { TextBuilder sb = new TextBuilder(); sb.append("<html><body><center><br><br><br><font color=\"006600\">Class Master:</font><br>"); ClassId classId = player.getClassId(); int level = player.getLevel(); int jobLevel = classId.level(); int newJobLevel = jobLevel + 1; if ((((level >= 20 && jobLevel == 0) || (level >= 40 && jobLevel == 1) || (level >= 76 && jobLevel == 2)) && Config.CLASS_MASTER_SETTINGS.isAllowed(newJobLevel))) { if (((level >= 20 && jobLevel == 0) || (level >= 40 && jobLevel == 1) || (level >= 76 && jobLevel == 2)) && Config.CLASS_MASTER_SETTINGS.isAllowed(newJobLevel)) { sb.append("Avaliable classes:<br>"); for (ClassId child : ClassId.values()) { if (child.childOf(classId) && child.level() == newJobLevel) sb.append("<br><a action=\"bypass " +(isBBS?"_bbschange_class ":"voice_classmaster ") + (child.getId()) + "\"> " + CharTemplateTable.getClassNameById(child.getId()) + "</a>"); } if (Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel) != null && !Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).isEmpty()) { sb.append("<br><br>Required items:"); sb.append("<table width=270>"); for (Integer _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keySet()) { int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId); sb.append("<tr><td><font color=\"LEVEL\">" + _count + "</font></td><td>" + ItemTable.getInstance().getTemplate(_itemId).getName() + "</td></tr>"); } sb.append("</table>"); } } sb.append("<br>"); } else { switch (jobLevel) { case 0: if (Config.CLASS_MASTER_SETTINGS.isAllowed(1)) sb.append("Call me after <font color=\"LEVEL\">20</font> level.<br>"); else if (Config.CLASS_MASTER_SETTINGS.isAllowed(2)) sb.append("Call me after 1st class transfer.<br>"); else if (Config.CLASS_MASTER_SETTINGS.isAllowed(3)) sb.append("Call me after 2nd class transfer.<br>"); else sb.append("You can't change your profession.<br>"); break; case 1: if (Config.CLASS_MASTER_SETTINGS.isAllowed(2)) sb.append("Call me after <font color=\"LEVEL\">40</font> level.<br>"); else if (Config.CLASS_MASTER_SETTINGS.isAllowed(3)) sb.append("Call me after 2nd class transfer.<br>"); else sb.append("You can't change your profession.<br>"); break; case 2: if (Config.CLASS_MASTER_SETTINGS.isAllowed(3)) sb.append("Call me after <font color=\"LEVEL\">76</font> level.<br>"); else sb.append("You can't change your profession.<br>"); break; case 3: sb.append("You reach top class.<br>"); break; } sb.append("<br>"); } sb.append("</center></body></html>"); return sb.toString(); } else { int val = Integer.parseInt(args); ClassId classId = player.getClassId(); ClassId newClassId = ClassId.values()[val]; int level = player.getLevel(); int jobLevel = classId.level(); int newJobLevel = newClassId.level(); if (!Config.CLASS_MASTER_SETTINGS.isAllowed(newJobLevel)) return NOT_ALLOWED; if (!newClassId.childOf(classId)) return NOT_ALLOWED; if (newJobLevel != jobLevel + 1) return NOT_ALLOWED; if (level < 20 && newJobLevel > 1) return NOT_ALLOWED; if (level < 40 && newJobLevel > 2) return NOT_ALLOWED; if (level < 76 && newJobLevel > 3) return NOT_ALLOWED; // Weight/Inventory check if(!Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).isEmpty()) { if (player.getWeightPenalty() >= 3 || (player.getInventoryLimit() * 0.8 <= player.getInventory().getSize())) { player.sendPacket(new SystemMessage(SystemMessageId.INVENTORY_LESS_THAN_80_PERCENT)); return NOT_ALLOWED; } } for (Integer _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keySet()) { int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId); if (player.getInventory().getInventoryItemCount(_itemId, -1) < _count) { player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS); return NOT_ALLOWED; } } for (Integer _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keySet()) { int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId); player.destroyItemByItemId("ClassMaster", _itemId, _count, player, true); } for (Integer _itemId : Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).keySet()) { int _count = Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).get(_itemId); player.addItem("ClassMaster", _itemId, _count, player, true); } changeClass(player, val); player.rewardSkills(); if (newJobLevel == 3) player.sendPacket(SystemMessageId.THIRD_CLASS_TRANSFER); else player.sendPacket(SystemMessageId.CLASS_TRANSFER); TextBuilder sb = new TextBuilder(); sb.append("<html><body>"); sb.append("<br><br><center>"); sb.append("Поздравляю, Р’С‹ получили класс: <font color=\"LEVEL\">" + CharTemplateTable.getClassNameById(player.getClassId().getId()) + "</font>."); sb.append("</center></body></html>"); player.refreshOverloaded(); player.refreshExpertisePenalty(); player.broadcastFullInfo(); return sb.toString(); } } private void changeClass(L2PcInstance player, int val) { player.setClassId(val); if (player.isSubClassActive()) player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass()); else player.setBaseClass(player.getActiveClass()); player.broadcastUserInfo(); player.broadcastClassIcon(); } @Override public String[] getCommands() { return new String [] {"change_class"}; } @Override public String handleCommand(L2PcInstance activeChar, String command, String args) { return process(activeChar,args,true); } public static void main(String [] args) { if(Config.SPAWN_CLASS_MASTER) { ClassMaster cm = new ClassMaster(); VoicedCommandHandler.getInstance().registerVoicedCommandHandler(cm); CommunityBoard.getInstance().registerBBSHandler(cm); } } } Дело в том, что если искать for (Integer _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keySet()) то находится 3 таких строки, а return process(player, "",false); - такого нет вообще. Если делаю копипасту из шапки, то получаю неработоспособного классмастера и ClassMaster.java.error.log следующего содержания: Error on: X:\SERVER\game\data\scripts\handlers\voice\ClassMaster.java.error.log Line: -1 - Column: -1 compilation failed
×
×
  • Create New...