Ну это слишком просто. И опять к нажатиям переходить? Я от них уже ушел
Новое - это хорошо забытое старое ))
Цитата:
Сообщение от sumikot
Тоже не хочу. Гораздо больше адресов. Труднее будет обновлять. Да и заморочек больше. У меня в самом первом боте использовался массив Action, в том числе и ручник. На мой взгляд - гемор.
Тогда либо смирись с разворотом перса, либо Esc. А вообще, расскажи плз, в каких это случаях тебе нужно останавливать перса. Ни разу не встречал необходимости останавливать перса.
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Тогда либо смирись с разворотом перса, либо Esc. А вообще, расскажи плз, в каких это случаях тебе нужно останавливать перса. Ни разу не встречал необходимости останавливать перса.
Esc, если я правильно помню, сначала вытирает таргет. Только потом стоп. Буду в игре - посмотрю. А остановка нужна при упоре в препятствие, допустим. Ведь когда играет человек, он не ждет, пока перс на месте полминуты будет бежать. Потом стоп нужен еще при копке ресов и при подьеме лута. Что делает человек? Ткнул в пенек, перс недобегая, остановился и копает. А бот (во всяком случае, у меня) отправляет перса по координатам этого пенька, ждет остановки, потом (стоя с пеньком в одних координатах) начинает копать. Можно отследить дистанцию и остановить, недобегая. Можно вычислить точку, куда послать, чтобы он недобежал. В этом варианте лень возиться с расчетами в трехмерной системе, хотя он самый удачный. А теперь что получилось со стопом по инжекту с текущими координатами - останавливается, недобегая, разворачивается спиной к пеньку и начинает копать... Неэстетично как то...
Все таки буду точку считать, раз вариантов больше нет.
А если сразу послать пакет на стоп, но только с неправильными координатами? Так геобот делает, после подьема на высоту. В итоге сервер нам пришлет пакет с текущими координатами и все. Правда хз, прекратится ли инжект на движение.
Кстати, а может попробовать поймать инжект на остановку? Тот, что происходит при нажатии ESC
Цитата:
Сообщение от sumikot
Esc, если я правильно помню, сначала вытирает таргет.
А если таргета нету, то будет стоп
Цитата:
Сообщение от sumikot
А бот (во всяком случае, у меня) отправляет перса по координатам этого пенька,
Дык, определи расстояние на котором перс может копать пенек. И беги не в точку пенька, а рядом и все.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]-cофт и прочее для комфортной игры в PW.
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
отом стоп нужен еще при копке ресов и при подьеме лута.
У меня это делает инжект, который тыкает по пеньку и перс бежит к пеньку и копает или собирает лут.
Если обнаруживается припятствие - нужно бежать в бок или назад, но никак не останавливаться, если, конечно, ты не научился работать с directX-овскими объектами и вычислять координаты препятствий.
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
В порядке бреда: перед остановкой вынуть из клиента угол поворота персонажа, отправить инжект в текущие координаты и запихнуть в клиент угол поворота, который был до отправки инжекта. Это конечно бред, так как исправит последствия, а не причину. Попробуй посылать в инжекте на "остановку" координаты +1/2, может помочь, хотя и не лучшее решение
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
и что значит ret в конце? - без него сработало, предыдущий код был без ret
Тут все зависит от компилятора и языка. Я писал на аутоит, ret (возврат из подпрограммы) там был нужен обязательно. Когда тот же инжект попробовал написать на С++, а затем декомпилировать, увидел, что компилятор подставляет его сам.
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
мозг взорван... если после запуска клиента какое-то время не трогать (какое не удалось выяснить) - то прога компилится, правится, снова компилится - и перс движется.
после перезапуска клиента - та же прога, которая только что на ура двигала перса - вызывает краш. причём соединение идёт, информацию читает
Код:
Pxyz = ^xyz;
xyz = record
x : single;
z : single;
y : single;
end;
procedure WalkCall(aPParams:PParams);Stdcall;
const
ActionArrOfs=nz_ActionArrOfs;
var
WalkMode:DWORD;
coord : xyz;
Pcoord : Pxyz;
begin
coord.x := aPParams^.x;
coord.y := aPParams^.y;
coord.z := aPParams^.z;
Pcoord := @coord;
WalkMode:=aPParams^.Param1;
asm
pushad
mov edx, nz_base_add
mov ecx, dword ptr [edx]
mov edx, dword ptr [ecx+nz_pers_path_1]
mov esi, [edx+nz_pers_path_2]
mov ecx, dword ptr [esi+ActionArrOfs]
mov eax, dword ptr [esi+WalkMode]
push $01
mov edx, nz_walk1
call edx
mov edi, eax
push Pcoord // адрес координат для движения
push WalkMode// 0- пешком, 1- полет, вплавь
mov ecx, edi
mov edx, nz_walk2
call edx
push $00
push $01
push edi
push $01
mov ecx, dword ptr [esi+ActionArrOfs]
mov edx, nz_walk3
call edx
popad
end;
end;
procedure Walk_nz(hProcess : Cardinal; x,y,z:Single; BaseWalkMode:Byte);
var aParams: TParams;
begin
if BaseWalkMode = 0 then aParams.Param1:=0 else aParams.Param1:=1;
AParams.x:=x;
AParams.y:=y;
AParams.z:=z;
InjectFunc(hProcess,@WalkCall,@aParams,SizeOf(aParams));
end;
закоромерность вылета следующая: после перезапуска клиента - если координаты брать как переменные - из скажем результата считывания xyz моба - будет вылет. если подсунуть координаты в виде чисел - перс движется. после этого возвращаем переменные - перс движется.
Цитата:
Сообщение от sumikot
Сохраняешь в выделенной памяти клиента три переменные флоат x.z.y подряд.
есть подозрение, что память под push Pcoord надо таки выделять в памяти клиента - а не программы. вот только как это сделать?
Последний раз редактировалось yeyebvz; 30.01.2013 в 01:58.
есть подозрение, что память под push Pcoord надо таки выделять в памяти клиента - а не программы. вот только как это сделать?
Элементарно. )))) запихиваешь координаты в стэк и передаешь указатель стека как push Pcoord // адрес координат для движения
Добавлено через 12 минут
Цитата:
Сообщение от krukovis
Если обнаруживается припятствие - нужно бежать в бок или назад, но никак не останавливаться, если, конечно, ты не научился работать с directX-овскими объектами и вычислять координаты препятствий.
зачем такие сложности? в серверных картах все непроходимые места обозначены. добавить только координаты динамических обьектов (нпс и проч.)- и все. а если уж совсем по-взрослому: пропускаешь всю эту кухню через волну или А* и никто никуда не упирается и бежит как живой )))))
Последний раз редактировалось GenOstr; 30.01.2013 в 23:22.
Причина: Добавлено сообщение
Элементарно. )))) запихиваешь координаты в стэк и передаешь указатель стека как push Pcoord // адрес координат для движения
угу)) что такое стек понимаю. лекции по програмингу и математике. вот только засада... почему-то на программировании тупо рассказывают теорию, забывая о практике... что такое var i:integer; - понятно, record - тоже)) но я так и не понял что такое стек в программировании - как объявляется, как потом стучаться в его элементы...
в общем.... буду пробовать переписывать старую функцию, где координаты отдавались в теле, без выделения памяти((
Sh - расстояние точки останова к ресу (луту, или что там у вас)
XT, YT - координаты точки где надо остановится
XC, YC - текущие координаты
XR, YR - координаты реса
if (XC > XR) then
XT := XR + Sh
else
XT := XR - Sh;
if (YC > YR) then
YT := YR + Sh
else
YT := YR - Sh;
Нарисовать на листик ось, ткнуть 2-е точки и пораскинуть мозгами? Не, не слышал...
Последний раз редактировалось krysun; 31.01.2013 в 15:44.
но я так и не понял что такое стек в программировании - как объявляется, как потом стучаться в его элементы...
Тут в принцыпе теории(и воображения) должно быть вполне достаточно)
Вот пример: мы пишем на низкоуровневом языке, например асме. Мы написали кусок кода - функцию, которая выполняет какие-либо действия(возможно и возвращает какое либо значение), так же она принимает какие-либо входящие значения. Как мы можем из различных кусков кода нашей программы перейти по адресу этой сАмой функции, и при этом она бы получила эти данные? Понятно, что перед переходом нужно эти входные данные куда-то поместить, и функция должна знать откуда их брать, не зная с какого места проги к ней вообще перепрыгнули. Для этого существуют регистры процессора и стек. То-есть мы пишем функцию, которая к примеру берёт значение с определённого регистра и производит на основании этого параметра "что-нибудь". Значит перед обращением к функции, мы должны параметр(или несколько) пихнуть в этот регистр(или несколько), а другой кусок кода(наша функция) уже их оттуда берёт. Так же есть другой способ передачи параметров в функцию, существует такая штука как СТЕК. Стек - это кусок памяти, в котором при выполнении проги хранятся какие-либо данные. Этот стек можено "наполнять" различными значениями, для этого существует команда процессора в (ассемблерном написании) PUSH [регистр], при этом значение из регистра копируется в стек(в начало памяти, отведённое под этот стек). Откуда процессор знает где этот самый адрес в стеке и куда помещать значение из указанного регистра по команде PUSH? А это значение адреса так же находится в одном из регистров процессора, который служит для работы со стеком. После приведённой выше команды проц берёт из указанного регистра значение и "пихает" его в память по адресу, который указан в регистре SP(стек пойнт - вершина стека) при этом он автоматом уменьшает значение регистра-указателя вершины стека, чтобы при следующем PUSH второе помещаемое значение не затёрло первое(оно нам ещё нужно, ну не зря же мы его в стек пихали), размер стека естественно увеличится, так как там уже 2 значения. При переходе в функцию, значение из стека достаётся командой POP [регистр], при этом всё происходит в обратном порядке.
Кстати, при вызове функции (CALL) мы переходим по какому-либо адресу, но ведь функция подразумевает возврат в то место, откуда мы на неё перешли, не так ли? Так вот адрес возврата тоже помещается в стек, и при RET из функции значение из стека берётся и по этому адресу переход и происходит обратно.
На практике ты вообще можешь нафиг не знать где и в каком месте этот стек находится, главное знать для чего он нужен и понимать в каком порядке туда помещаются значения(принцып LIFO, Last In, First Out — последним пришёл — первым ушёл).
Теперь что касется языков более высокого уровня.. Там ведь нет таких заморочек с регистрами-шмегистрами? Есть, просто это всё представлено в намного удобной форме.
Допустим у нас есть функция
1| float a = Испечь_лепёшек(1000);
2| bool b = огорчиться_что_нихера_не_вышло;
При вызове функции наше значение 1000 пихнётся в стек, а в функции, когда мы будем оперировать значением kol - это и будет это значение "достатое" со стека.
return удачно_испечёные; - возмёт адрес возврата(а это будет адрес сделующей строчка нашей программы - 2| bool b = огорчиться_что_нихера_не_вышло и перейдёт по нему, то-есть вернётся из функции.
Так вот что касается практики.. просто знайте что оно происходит примерно так, либо пишите на асме, чтоб прям всем и вся управлять самому)). Кстати, в настройках компиляторов должен быть такой пункт, как указать нужный для нашей проги способ передачи параметров, через стек или через регистры, но любителю нафиг об этом задумываться, писать себе прогу, а там как нибудь да передастся)).
Если где-то ошибся в объяснении, надеюсь меня поправяи и не отругают ногами)
Добавлено через 2 минуты
Цитата:
Сообщение от yeyebvz
угу)) что такое стек понимаю. лекции по програмингу и математике. вот только засада... почему-то на программировании тупо рассказывают теорию, забывая о практике... что такое var i:integer; - понятно, record - тоже)) но я так и не понял что такое стек в программировании
ну да))
Цитата:
Сообщение от yeyebvz
как объявляется, как потом стучаться в его элементы...
стучаться POP-ом, запихивать в него PUSH-ем на асме, а в яз высокого уровня ты не задумываешься об этом. просто птшешь в проге тот параметр как входящий в функции указан, при компиляции всё само "раскидается" как нуно
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 31.01.2013 в 17:09.
Причина: Добавлено сообщение