boVer 12 Опубликовано 4 июля, 2023 Всем доброго времени суток. Интересует мнение java-разработчиков по л2. Есть 2 скрипта автофарма. Проблема вот в чем. Первый скрипт работает с задержкой, а именно маг бьет "скажем так" раз в секунду. Кусок кода удара мага ниже. А именно "else if" try { if (skill.isBattleForceSkill() || skill.isSpellForceSkill()) { player.setGroundSkillLoc(null); if (skill.checkForceCondition(player, sc.getId())) { player.useMagicBot(skill, false, isMage); } else { player.sendPacket(Static.NOT_ENOUGH_FORCES); } } else if (skill.checkCondition(player, player, false)) { player.useMagicBot(skill, false, isMage); } } catch (Exception e) { // e.printStackTrace(); } Второй скрипт переделал сам, маг теперь бьет идеально, и есть возможность выставить задержку в цикле. Но тут проблема такая что если к примеру на боте стоит 30-40 персонажей, сервак начинает моросить, фризит, ацп перестает работать. Пример кода ниже. while (true) { try { if (!target.isAlikeDead()) { player.useMagicBot(skill, false, false); } if (target.isAlikeDead()) { nextTarget(); return; } if (!player.canSeeTarget(target)) { nextTarget(); return; } Thread.sleep(150); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Если есть кто может подсказать как реализовать или куда посмотреть чтоб убрать проблему второго варианта - буду благодарен. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
boVer 12 Опубликовано 4 июля, 2023 Сорри за форматирование кода в топике. Сборка пвсофт Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saltfire 87 Опубликовано 4 июля, 2023 Ну потому что есть протектор скорее всего, чтобы не флудили пакетами. Уже где-то был такой вопрос. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
lvlkoo 190 Опубликовано 5 июля, 2023 (изменено) Скорее всего Вам нужно избавляться от Цитата while (true) и Цитата Thread.sleep(150) Поищите в вашей сборке механизмы которые используют т.н шедулинг таски, реализацию Runnable. У вас должна быть обвертка над ThreadPoolExecutor\ScheduledThreadPoolExecutor, которая скорее всего называеться что-то вроде ThreadPoolManager Там с помощью методов schedule(..) можно запускать фоновые задачи которые будут выполняться в асинхронном режиме в пуле. Все действия по автофарму и задержки между ними реализовуйте с помощью этих тасок, Изменено 5 июля, 2023 пользователем lvlkoo Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LexPraim 3 Опубликовано 14 июля, 2023 Большая нагрузка происходит из-за того, что данная часть кода выполняется в цикле while (true), который продолжает выполняться до тех пор, пока не будет вызвано исключение или процесс не будет принудительно прерван. В каждой итерации цикла выполняются следующие действия: Проверяется, жива ли цель (target.isAlikeDead()). Если цель не мертва, вызывается player.useMagicBot(skill, false, false) для использования магии. Если цель мертва, вызывается nextTarget() для выбора следующей цели и завершается выполнение текущей итерации цикла. Если игрок не видит цель (!player.canSeeTarget(target)), вызывается nextTarget() для выбора следующей цели и завершается выполнение текущей итерации цикла. После выполнения всех проверок и действий выполняется задержка в 150 миллисекунд с помощью Thread.sleep(150). Таким образом, постоянное выполнение этого кода в цикле без задержки может создать большую нагрузку на систему, особенно если это происходит на длительном промежутке времени. Рекомендуется добавить дополнительные условия или пересмотреть логику цикла, чтобы снизить нагрузку. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LordWinter 78 Опубликовано 15 июля, 2023 пока такс выполнения цикличности будет общий, как бы вы не старались будут проблемы с задержками, которые в итоге потом приведут к тому что фарм умрет для всех игроков сервера. Разделяй и оптимизируй запросы чтоб не было перегруза на цпу для каждого чара отдельно Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты