Jump to content
Sign in to follow this  
boVer

вопрос по автофарму

Recommended Posts

Всем доброго времени суток. Интересует мнение 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

Сорри за форматирование кода в топике.
Сборка пвсофт

Share this post


Link to post
Share on other sites

Ну потому что есть протектор скорее всего, чтобы не флудили пакетами. Уже где-то был такой вопрос.

Share this post


Link to post
Share on other sites

Скорее всего Вам нужно избавляться от 

Цитата

while (true)

и

Цитата

Thread.sleep(150)

Поищите в вашей сборке механизмы которые используют т.н шедулинг таски, реализацию Runnable.

У вас должна быть обвертка над ThreadPoolExecutor\ScheduledThreadPoolExecutor, которая скорее всего называеться что-то вроде ThreadPoolManager

Там с помощью методов schedule(..) можно запускать фоновые задачи которые будут выполняться в асинхронном режиме в пуле.

Все действия  по автофарму и задержки между ними реализовуйте с помощью этих тасок,

Edited by lvlkoo

Share this post


Link to post
Share on other sites

Большая нагрузка происходит из-за того, что данная часть кода выполняется в цикле while (true), который продолжает выполняться до тех пор, пока не будет вызвано исключение или процесс не будет принудительно прерван. В каждой итерации цикла выполняются следующие действия:

  1. Проверяется, жива ли цель (target.isAlikeDead()).
  2. Если цель не мертва, вызывается player.useMagicBot(skill, false, false) для использования магии.
  3. Если цель мертва, вызывается nextTarget() для выбора следующей цели и завершается выполнение текущей итерации цикла.
  4. Если игрок не видит цель (!player.canSeeTarget(target)), вызывается nextTarget() для выбора следующей цели и завершается выполнение текущей итерации цикла.
  5. После выполнения всех проверок и действий выполняется задержка в 150 миллисекунд с помощью Thread.sleep(150).

Таким образом, постоянное выполнение этого кода в цикле без задержки может создать большую нагрузку на систему, особенно если это происходит на длительном промежутке времени. Рекомендуется добавить дополнительные условия или пересмотреть логику цикла, чтобы снизить нагрузку.

Share this post


Link to post
Share on other sites

пока такс выполнения цикличности будет общий, как бы вы не старались будут проблемы с задержками, которые в итоге потом приведут к тому что фарм умрет для всех игроков сервера. Разделяй и оптимизируй запросы чтоб не было перегруза на цпу для каждого чара отдельно

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...