boVer 12 Posted July 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(); } } Если есть кто может подсказать как реализовать или куда посмотреть чтоб убрать проблему второго варианта - буду благодарен. Share this post Link to post Share on other sites
boVer 12 Posted July 4, 2023 Сорри за форматирование кода в топике. Сборка пвсофт Share this post Link to post Share on other sites
Saltfire 90 Posted July 4, 2023 Ну потому что есть протектор скорее всего, чтобы не флудили пакетами. Уже где-то был такой вопрос. Share this post Link to post Share on other sites
lvlkoo 190 Posted July 5, 2023 (edited) Скорее всего Вам нужно избавляться от Цитата while (true) и Цитата Thread.sleep(150) Поищите в вашей сборке механизмы которые используют т.н шедулинг таски, реализацию Runnable. У вас должна быть обвертка над ThreadPoolExecutor\ScheduledThreadPoolExecutor, которая скорее всего называеться что-то вроде ThreadPoolManager Там с помощью методов schedule(..) можно запускать фоновые задачи которые будут выполняться в асинхронном режиме в пуле. Все действия по автофарму и задержки между ними реализовуйте с помощью этих тасок, Edited July 5, 2023 by lvlkoo Share this post Link to post Share on other sites
LexPraim 5 Posted July 14, 2023 Большая нагрузка происходит из-за того, что данная часть кода выполняется в цикле while (true), который продолжает выполняться до тех пор, пока не будет вызвано исключение или процесс не будет принудительно прерван. В каждой итерации цикла выполняются следующие действия: Проверяется, жива ли цель (target.isAlikeDead()). Если цель не мертва, вызывается player.useMagicBot(skill, false, false) для использования магии. Если цель мертва, вызывается nextTarget() для выбора следующей цели и завершается выполнение текущей итерации цикла. Если игрок не видит цель (!player.canSeeTarget(target)), вызывается nextTarget() для выбора следующей цели и завершается выполнение текущей итерации цикла. После выполнения всех проверок и действий выполняется задержка в 150 миллисекунд с помощью Thread.sleep(150). Таким образом, постоянное выполнение этого кода в цикле без задержки может создать большую нагрузку на систему, особенно если это происходит на длительном промежутке времени. Рекомендуется добавить дополнительные условия или пересмотреть логику цикла, чтобы снизить нагрузку. Share this post Link to post Share on other sites
LordWinter 78 Posted July 15, 2023 пока такс выполнения цикличности будет общий, как бы вы не старались будут проблемы с задержками, которые в итоге потом приведут к тому что фарм умрет для всех игроков сервера. Разделяй и оптимизируй запросы чтоб не было перегруза на цпу для каждого чара отдельно Share this post Link to post Share on other sites