Цитата:
skymanrus, падскажи пажалуста дураку
|
отличный вопросы и совсем не дурацкие ! :)
в файле main.dpr
проставленны все эти значения в % принятые по умолчанию
Код:
sitHPproc:=55; upHPproc:=100;butHPproc:=70;
можно конечно их там изменить и перекомпилить все но лучше будет сделать так
Код:
procedure TForm1.Edit3Change(Sender: TObject);
begin sitHPproc:=strtoint(Form1.Edit3.text); end;
procedure TForm1.Edit4Change(Sender: TObject);
begin butHPproc:=strtoint(Form1.Edit4.text);end;
procedure TForm1.Edit5Change(Sender: TObject);
begin upHPproc:=strtoint(Form1.Edit5.text);end;
Цитата:
и как можно заставить его юзать скилы
|
это уже по сложнее
вот попытаюсь это обьяснить на примере скила спойла
вот наши заветные 10 байт обозначающие сей скилл '2F FE 00 00 00 00 00 00 00 00'
теперь чтоб заставить бота использовать этот скилл надо просто вставить его в единственную функцию которая вызывается из dll'ки и передаёт какую то инфу l2phx эта функция в исходнике называется
ВНИМАНИЕ ! не путать с процедурой procedure Attack(atk,tar,xpos,ypos,zpos: integer); ! это разные процедуры!
именно из atackMOB посылаются все пакеты (сесть, встать, юзнуть банку ударить моба) которые гененирует SKYbot так что для того чтоб он юзал какие то скилы надо туда пихнуть в конец процедуры перед последними end;end; код использования скилла какого захочеш
например так
Код:
getrstr:='2F FE 00 00 00 00 00 00 00 00';
:) теперь все что будет делать бот это тупо кидать на всех споил и все ! :) ну тоесть испортиться фактически :)
для того чтоб он знал когда надо юзать скил а когда надо и другими вещами заниматься (сесть, встать, юзнуть банку ударить моба) надо добавить условие при котором юзается сей скилл например для спойла
это условие будет на человеском языке звучать так - если моб ещё не заспойлен то надо его заспойлить
а на delphi это будет по сложнее озвучить
надо добавить в SKYbot ещё 1 процедуру сбора информации которая будет говорить SKYbot что каст на моба прошёл
все процедуры сбора информации вы увидите в l2phx в скритпе который грузит dll
Код:
#$03:CallFunction(lib,'CharInfo',4,[ReadD(18),ReadD(2),ReadD(6),ReadD(10)]);
#$04:CallFunction(lib,'UserInfo',6,[ReadD(18),ReadD(2),ReadD(6),ReadD(10),126,ReadS(22)]);
#$01:CallFunction(lib,'MoveToLocation',4,[ReadD(2),ReadD(6),ReadD(10),ReadD(14)]);
#$16:CallFunction(lib,'NpcInfo',6,[ReadD(2),ReadD(10),ReadC(121),ReadD(14),ReadD(18),ReadD(22)]);
#$12:CallFunction(lib,'killmob',1,[ReadD(2)]);
#$06:CallFunction(lib,'killmob',1,[ReadD(2)]);
#$05:CallFunction(lib,'Attack',5,[ReadD(2),ReadD(6),ReadD(15),ReadD(19),ReadD(23)]);
#$0D:CallFunction(lib,'GetItem',1,[ReadD(6)]);
#$0C:CallFunction(lib,'DropItem',5,[ReadD(10),ReadD(6),ReadD(14),ReadD(18),ReadD(22)]);
#$0E:if(pck[10]=#$09)then CallFunction(lib,'StatusUpdate',3,[ReadD(2),ReadD(14),ReadD(22)]);
#$27:CallFunction(lib,'InventoryUpdate',2,[ReadD(12),ReadD(8)]);
то есть новая процедура будет такая
Код:
#$76:CallFunction(lib,'MagicSkillLaunched',2,[ReadD(2),ReadD(18)]);
первый аргумент который передаются в dll'ку будут идом того кто юзнул скилл - ReadD(2) а ReadD(18) это ид того на кого юзнули скилл
теперь надо собственно создать процедуру MagicSkillLaunched в dll'ке
первым наперво добавляем её к списку экспортируемых функций в файле main.dpr
Код:
exports MagicSkillLaunched,getr,UserInfo....
затем надо написать саму процедуру в файле SKYbot.pas
для этого перед директивой implementation обьявляем прототип функции типа
Код:
procedure MagicSkillLaunched(idskill,idtarget:integer); stdcall;
и потом пишем саму процедуру после директивы implementation
в которой надо как то пометить моба на которого ты юзаеш сей скилл
например самый простой вариант который мне сейчас пришёл на ум это создание ещё одного массива где будут хранится данные показывающие использовался ли на данном мобе какой то скилл
типа массива MobsSKILL: array[1..150] of integer;
и теперь если в дллку в процедуру MagicSkillLaunched придет 2 значения в первом будет ид нашего чара а во втором будет ид моба то можно записать это в массив MobsSKILL и теперь SKYbot знает что на каком то мобе был использовать какой скилл
дальше надо обязательно найти процедуру procedure killmob(id:integer);
и поставить там строку обнуляющую MobsSKILL в случае смерти моба
теперь когда все данные у нас есть можно свободно составить в процедуре atackMOB соответствующие условие для вызова скилла спойла
например такое
Код:
if MobsSKILL[ataM]=0 then getrstr:='2F FE 00 00 00 00 00 00 00 00';
в переменной ataM записан номер моба в "базе данных" (на самом деле это всего лиш несколько массивов) которого сейчас атакует бот тоесть на человеческом языке строка
Код:
if MobsSKILL[ataM]=0 then getrstr:='2F FE 00 00 00 00 00 00 00 00';
будет звучать так:
Код:
моб которого сейчас атакует чар был заспойлен? если 0 то спойлим
мы его заспойлили и тут же пришёл пакет в процедуру MagicSkillLaunched а в ней в MobsSKILL записалось соответствующие значение отличное от нуля и теперь бот не будет больше использовать споил на заспойленного моба когда моб умрет бот сотрёт все данные о нём и запишет туда другого моба если встретит
вот так вот :D все очень просто :ROFL:
я бы сам этим сейчас занялся но не особо сейчас вижу смысла продолжать писать этот алгоритм на delphi так как честно говоря я был немного удивлён когда получил дллку в пол мига где почти ничего не делается :) кроме того время от времени возникают очень странные ошибки т.е. бот качается так себе... и как бы все хорошо но тут оп и та процедура которую он уже выполнил раз 100000 вдруг выдаёт неизвесную ошибку.. это меня добивает чесно говоря, не говоря уже о том что скорость выполнения расчётов оставляет желать лучшего... короче решил я все под ассемблер переписать чем сейчас и занимаюсь в настоящий момент