Перейти к содержанию
Авторизация  
obves

Ai мобов, что бы окружали игрока а не сбивались в кучу PWSOFT

Рекомендуемые сообщения

# Alternative AltGameMobAttackAI, like C1
AltGameMobAttackAI = false
----------------------------------------------------------------------------------
что это значит ? атака мобов как в с1, на что влияет? включая выключая не могу понять что изменяется? 



 
----------------------------------------------------------------------------------
#Ai мобов: агрессия/атака/спавн; 10
NpcAiMaxThread = 20
#Ai игроков: все что связано с игроком (сесть, встать, тюрьма, бч, дуэли, инвентарь и т.д.); 20
PlayerAiMaxThread = 35

----------------------------------------------------------------------------------

за что отвечают эти параметры?

 

помогите пожалуйста кто знает
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

первое без изучения кода аи не понять

 

остальное два - это сколько потоков выделять для соответствующих задач.

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

но увлекаться увеличением потоков тоже не стоит, т.к. на сколько потоков эффективнее распаралеливать задачи зависит от количества процов/ядер в процах.

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

первое без изучения кода аи не понять

 

остальное два - это сколько потоков выделять для соответствующих задач.

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

но увлекаться увеличением потоков тоже не стоит, т.к. на сколько потоков эффективнее распаралеливать задачи зависит от количества процов/ядер в процах.

благодарю за ответ! а как расчет ведется что бы лучше оптимизировать потоки задач? 

 

а по первому вопросу АИ с1 все же что это значит? хоть примерно в чем отличие? 

 

и вопрос по теме как сделать что бы мобы окружали игрока во время атаки? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и вопрос по теме как сделать что бы мобы окружали игрока во время атаки?

дорабатывать аи мобов, чтобы проверяли, не стоит ли в конечной точке передвижения (или очень близко от нее) какой нибудь другой объект (моб/игрок) и если стоит то искать другое свободное место поблизости

но я бы не советовал подобное делать если честно - имхо жрать это будет основательно ресусы - постоянные проверки/перепроверки позиций объектов мобом при его передвижениях...

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дорабатывать аи мобов, чтобы проверяли, не стоит ли в конечной точке передвижения (или очень близко от нее) какой нибудь другой объект (моб/игрок) и если стоит то искать другое свободное место поблизости

но я бы не советовал подобное делать если честно - имхо жрать это будет основательно ресусы - постоянные проверки/перепроверки позиций объектов мобом при его передвижениях...

спасибо за ответ! все же где, какие настройки за это отвечают? что то можно придумать без ковыряния ядра? если в ядре то где именно смотреть? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делал у себя по фану регруп мобов вокруг игрока. Вот код, может поможет чем-то или наведет на какие-нибудь мысли :)

...
		if(!firstTarget.character.isMoving() && regroupLock.compareAndSet(false, true)) { //regroup to other location
			ThreadPoolManager.getInstance().scheduleGeneral(() -> regroupLock.set(false), Rnd.get(11), TimeUnit.SECONDS);
			if(regroup(range)) {
				return;
			}
		}
...

	protected boolean regroup(int range) {
		final L2Attackable actor = getActor();
		
		final int collision = actor.getTemplate().getCollisionRadius() * 2 + MathUtil.DiscreteSize;
		final int currentCount = actor.getWorld().getVisible(L2Attackable.class, actor, collision, false).size();
		if(currentCount == 0) {
			return false;
		}
		
		final Location target = firstTarget.character.getLocation();
		final Location current = actor.getLocation();
		final Location currentGeo = MathUtil.conv2geo(current);
		
		final List<Location> around = new ArrayList<>(360 / 20);
		for(int i = 0; i < 360; i += 20) {
			final Vector3 pos = target.toVector3();
			final Vector2 direction = pos.toVector2();
			direction.rotate2(i);
			direction.normalize();
			pos.multiplyAndAdd(direction, range);
			around.add(new Location(pos.toPoint3()));
		}
		
		Collections.sort(around, (o1, o2) -> { //sort locations by distance
			final double distance1 = o1.getDistance2(current);
			final double distance2 = o2.getDistance2(current);
			return distance1 == distance2 ? 1 :
				distance1 < distance2 ? -1 : 1;
		});
		
		int count = currentCount;
		int selectedIndex = -1;
		for(int i = 0; i < around.size(); i++) {
			final Location loc = around.get(i);
			if(loc.getZ() == Short.MIN_VALUE) {
				continue;
			}
			
			if(currentGeo.equalsWoZ(MathUtil.conv2geo(loc))) { //pass current point
				continue;
			}
			
			if(!GeoData.getInstance().raycast2(current, loc, actor.getInstanceId())
					|| !GeoData.getInstance().raycast3(loc.getX(), loc.getY(), loc.getZ(), target.getX(), target.getY(), target.getZ())) {
				continue;
			}
			
			final List<L2Attackable> actors = actor.getWorld().getVisible(L2Attackable.class, loc, collision, false);
			if(actors.isEmpty()) {
				selectedIndex = i;
				break;
			}
			
			if(count > actors.size()) {
				count = actors.size();
				selectedIndex = i;
			}
		}
		
		if(selectedIndex == -1) {
			return false;
		}
		
		params.set("isRegroup", true);
		setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, around.get(selectedIndex));
		return true;
	}
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делал у себя по фану регруп мобов вокруг игрока. Вот код, может поможет чем-то или наведет на какие-нибудь мысли :)

...
		if(!firstTarget.character.isMoving() && regroupLock.compareAndSet(false, true)) { //regroup to other location
			ThreadPoolManager.getInstance().scheduleGeneral(() -> regroupLock.set(false), Rnd.get(11), TimeUnit.SECONDS);
			if(regroup(range)) {
				return;
			}
		}
...

	protected boolean regroup(int range) {
		final L2Attackable actor = getActor();
		
		final int collision = actor.getTemplate().getCollisionRadius() * 2 + MathUtil.DiscreteSize;
		final int currentCount = actor.getWorld().getVisible(L2Attackable.class, actor, collision, false).size();
		if(currentCount == 0) {
			return false;
		}
		
		final Location target = firstTarget.character.getLocation();
		final Location current = actor.getLocation();
		final Location currentGeo = MathUtil.conv2geo(current);
		
		final List<Location> around = new ArrayList<>(360 / 20);
		for(int i = 0; i < 360; i += 20) {
			final Vector3 pos = target.toVector3();
			final Vector2 direction = pos.toVector2();
			direction.rotate2(i);
			direction.normalize();
			pos.multiplyAndAdd(direction, range);
			around.add(new Location(pos.toPoint3()));
		}
		
		Collections.sort(around, (o1, o2) -> { //sort locations by distance
			final double distance1 = o1.getDistance2(current);
			final double distance2 = o2.getDistance2(current);
			return distance1 == distance2 ? 1 :
				distance1 < distance2 ? -1 : 1;
		});
		
		int count = currentCount;
		int selectedIndex = -1;
		for(int i = 0; i < around.size(); i++) {
			final Location loc = around.get(i);
			if(loc.getZ() == Short.MIN_VALUE) {
				continue;
			}
			
			if(currentGeo.equalsWoZ(MathUtil.conv2geo(loc))) { //pass current point
				continue;
			}
			
			if(!GeoData.getInstance().raycast2(current, loc, actor.getInstanceId())
					|| !GeoData.getInstance().raycast3(loc.getX(), loc.getY(), loc.getZ(), target.getX(), target.getY(), target.getZ())) {
				continue;
			}
			
			final List<L2Attackable> actors = actor.getWorld().getVisible(L2Attackable.class, loc, collision, false);
			if(actors.isEmpty()) {
				selectedIndex = i;
				break;
			}
			
			if(count > actors.size()) {
				count = actors.size();
				selectedIndex = i;
			}
		}
		
		if(selectedIndex == -1) {
			return false;
		}
		
		params.set("isRegroup", true);
		setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, around.get(selectedIndex));
		return true;
	}

ой спасибо ! а в каком файле? в библиотеке находится? можешь сказать где еще файл отвечающий за корабль лежит библиотека какая? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

L2AttackableAI.

Корабли - L2Ship/L2VehicleЧетоТам или типа того. Я у себя их вообще удалил, поэтому точно не скажу.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...