Перейти к содержимому

Фотография
- - - - -

Альтернативный next_target

adrenalin target

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1
bawl

bawl

Функция поиска цели с приоритетом. 

function get_next: TL2Npc;
var
  value: TL2Npc;
  value_priority: integer;
  npc: TL2Npc;
  i, j: integer;
  priority: integer;
  distance: Cardinal;
  begin
       value:= nil;
       value_priority:= 0;
       for i:= 0 to NpcList.Count do begin
           priority:= 0;
           npc:= NpcList.Items(i);
           distance:= npc.DistTo(User);
           if (npc.IsPet or npc.IsMember or npc.Dead or (distance > 5000)) then Continue;

           /// Если у цели персонаж или группа в таргете
           if (npc.Target.Valid) and (npc.Target.OID = User.OID) or (npc.Target.IsMember)  then
              priority:= (5000 + 20 * (100 - npc.HP));

           /// Если цель находится в бою, умножить на два
           if (npc.InCombat) then
              priority:= priority * 2;

           /// Изменяем приоритет в зависимости от дистанции
           priority:= priority + (5000 - distance);

           /// Если цель в бою и дерется с другим игроком
           if npc.InCombat and npc.Target.Valid and ( (npc.Target.OID <> User.OID) or not npc.Target.IsMember ) then begin
              priority:= Trunc(priority * npc.HP / 500);
           end;

           /// Проверяем соседних монстров на дистацию от текущего монстра
           for j:= 0 to NpcList.Count do begin
               if (NpcList.Items(j).OID = npc.OID) then Continue;
               if (NpcList.Items(j).DistTo(npc) < 500) then
                  priority:= priority - (100 + Random(100));
           end;

           /// Сравниваем с нашим монстром
           if (value = nil) then begin
              value:= npc;
              value_priority:= priority;
           end;

           if (priority > value_priority) then begin
              value:= npc;
              value_priority:= priority;
           end;
           // Print(npc.Name +'[ ' + npc.ID.toString + '] priority: ' + priority.toString);
       end;
         Result:= value;
  end;    

  • 6

#2
martin

martin
  • 1
    -1
    Не выбрано
    • Гремлин

Подскажыте что надо писать в тех местах что написано я новичём в этом деле


  • -1

#3
xHRUSTx

xHRUSTx
  • 83
    30
    Не выбрано
    • Lvl 35
    • Пользователь
    Skype
    xhrustx

bawl, намечается альтернативный боевой движок?


  • 0

#4
bawl

bawl

xHRUSTx, он уже давно начат, в паблике будут только простые функции :)


  • 1

#5
rsd

rsd

он уже давно начат

но зачем?


  • 0

#6
xHRUSTx

xHRUSTx
  • 83
    30
    Не выбрано
    • Lvl 35
    • Пользователь
    Skype
    xhrustx

но зачем?

интерфейс очень сильно палится,а некоторый функционал и вовсе не работает... 

Тоже постоянно думаю о написании своего движка, но моего опыта программирования очевидно недостаточно для этого.

но зачем?

Делаешь для своего промышленного фарма или под продажу? Может даш свой скайп? Хотел бы пообщаться про пару моментов связанных с боевым движком, возможно и тебе какую-либо интересную инфу предоставить смогу


  • 0

#7
wlk

wlk

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


  • 1

#8
Krickt

Krickt
priority.toString

Вот это прикольно.


  • 0

#9
wlk

wlk

Сегодня дополнительно поинвестигейтил. Нашел 2 места, где по идеи за границы массива выходило. Кроме того иногда у моба хп находится не в пределах 0..100, а очень большое число, например 7кк (rpg x7), непонятно почему. Это приводило к тому что алгоритм неправильно срабатывал и моб не будет взят в таргет, либо вообще получим integer overflow. Кроме того была ошибка в условии в блоке: "Если цель в бою и дерется с другим игроком". Все выше, вроде, подфиксил как знал. Плюс добавил флажок на проверку нахождения моба в зоне. А то у меня чар воткнулся в стену в безуспешных попытках добраться до заветного "приоритетного" моба. Проапдейченая функция ниже:

function AlternativeGetNextTarget(npcs: TNpcList; usr: TL2Live; checkZone: boolean): TL2Npc;
var
  value: TL2Npc;
  value_priority: integer;
  npc: TL2Npc;
  i, j: integer;
  priority: integer;
  distance: Cardinal;
  npcHpCriteria: integer;
begin
	value:= nil;
	value_priority:= 0;
	for i:= 0 to npcs.Count - 1 do begin
	   priority:= 0;
	   npc:= npcs.Items(i);
	   distance:= npc.DistTo(usr);
	   npcHpCriteria := npc.HP;
	   
	   if(npc.HP > 100) then 
	   begin 
		print('NPC HP BUG. HP = ' + npc.HP.ToString());
		npcHpCriteria := 100;
	   end;
	   
	   if (npc.IsPet or npc.IsMember or npc.Dead or (distance > 5000) or (checkZone and not npc.InZone)) then Continue;

	   /// Если у цели персонаж или группа в таргете
	   if (npc.Target.Valid) and (npc.Target.OID = usr.OID) or (npc.Target.IsMember)  then	//5k - 7k
	   begin
		  priority:= (5000 + 20 * (100 - npcHpCriteria));
	   end;

	   /// Если цель находится в бою, умножить на два
	   if (npc.InCombat) then	// 0 calm mob || 10k - 14k for attacking mob
	   begin
		  priority:= priority * 2;
	   end;

	   /// Изменяем приоритет в зависимости от дистанции
	   priority:= priority + (5000 - distance);	// 0 - 5k if calm mob || 10k - 19k for attacking mob

	   /// Если цель в бою и дерется с другим игроком
	   if npc.Valid and npc.InCombat and npc.Target.Valid and (npc.Target.OID <> usr.OID) and not npc.Target.IsMember then begin
		  priority:= Trunc(priority * npcHpCriteria / 500);	// 0 - 1k if calm mob  || 0 (2k for full hp) - 3.8k for attacking mob
	   end; 

	   /// Проверяем соседних монстров на дистацию от текущего монстра
	   for j:= 0 to npcs.Count - 1 do begin
		   if (npcs.Items(j).OID = npc.OID) then Continue;
		   if (npcs.Items(j).DistTo(npc) < 500) then 
		   begin
			  priority:= priority - (100 + Random(100));
		   end;
	   end;

	   /// Сравниваем с нашим монстром
	   if (value = nil) then begin
		  value:= npc;
		  value_priority:= priority;
	   end;

	   if (priority > value_priority) then begin 
		  value:= npc;
		  value_priority:= priority;
		end;
		
		//Print(npc.Name +'[ ' + npc.ID.toString + '] priority: ' + priority.toString);
	end;
	//Print(value.Name +'[ OID = ' + value.OID.toString + ']');
	Result:= value;
 end;  

Что можно в будущем добавить еще, так это исключение бессмертных сундуков из поиска.


  • 3

#10
rasdva

rasdva
  • 19
    0
    Сонный
    • Lvl 13
    • Пользователь
    Skype
    meatorex

end;

выделяет красным последнее значение


  • 0

#11
BreadfanLock

BreadfanLock

rasdva, Это не готовый к исполнению скрипт, а - функция, возвращающая нпс(моба) с наивысшим приоритетом для атаки.


  • 1
Не изготавливаю готовый код...

#12
sasha282

sasha282
  • 234
    72
    Не выбрано
    • Lvl 40
    • Пользователь
    Skype
    Sanya628292
    Город
    Днепропетровск

Как использовать? Просто зациклить эту функцию?


  • 0

Skype: Sanya628292 


#13
rsd

rsd

перестать задавать тупые вопросы :dunno)


  • 0

#14
sasha282

sasha282
  • 234
    72
    Не выбрано
    • Lvl 40
    • Пользователь
    Skype
    Sanya628292
    Город
    Днепропетровск

rsd, Норм вопрос по-моему, сейчас нет возможности протестировать, поэтому хоть здесь узнаю наверняка.


  • 0

Skype: Sanya628292 


#15
wlk

wlk

sasha282, Да в любом месте кода, где вам надо будет выбрать нового моба для атаки. Функция не качается сама, не бьет моба сама. Просто возвращает объект самого приоритетного моба по некоторому правилу присвоения приоритетности. Приблизительный псевдокод для использования будет такой:

while (true) 
begin
    if (Engine.GetUser.Target = nil) or (Engine.GetUser.Target.Dead) then
    begin
       nextTarget := AlternativeGetNextTarget(...);
       Engine.SetTarget(nextTarget);
       Engine.Attack();
    end;
end;


Сообщение отредактировал wlk: 09 Сентябрь 2016 - 21:23

  • 3

#16
sasha282

sasha282
  • 234
    72
    Не выбрано
    • Lvl 40
    • Пользователь
    Skype
    Sanya628292
    Город
    Днепропетровск

wlk,  Что-то не могу дойти сам...Пишет что NextTarget нужно обьявить, но что ему обьявлять?) А так же ругается на (...) , как я догадываюсь там нужно указывать настройки, ид нпс, и еще что-то? 


Сообщение отредактировал sasha282: 11 Сентябрь 2016 - 09:12

  • 0

Skype: Sanya628292 


#17
wlk

wlk

sasha282, ессно. Это не готовый код, а псевдокод, то бишь то что не является готовым продуктом, а просто дает понимание, как использовать. Если уж переделывать в рабочий код, конечно же, надо обьявить var nextTarget: TL2Npc. Вызов AlternativeGetNextTarget вместо ... надо произвести с соотв. параметрами, скажем AlternativeGetNextTarget(Engine.GetNpcList, Engine.GetUser, false).

Кроме того, если вы уже решили его протестировать, то надо перса отвести на спот. И конечно же разбавить это все задержками.

Ну и прям в таком виде, в котором я написал постом выше оно будет не жизнеспособно. Перс будет утыкатся в деревья, камешки, уступы и т.д.


  • 1

#18
coker

coker
  • 10
    -1
    Не выбрано
    • Lvl 8
    • Пользователь

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


  • 0

#19
sasha282

sasha282
  • 234
    72
    Не выбрано
    • Lvl 40
    • Пользователь
    Skype
    Sanya628292
    Город
    Днепропетровск

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

Поставить в интерфейса бота задержку выбора цели.


  • 0

Skype: Sanya628292 




Темы с аналогичным тегами Готовый скрипт, adrenalin target

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Rawr.su - Сделано с для игроков.