Здравствуйте!
Не могу заставить перса бежать в определенную точку. Клиент падает в ошибку. Подскажите, пожалуйста, что в моем коде неправильно. Пишу на Autoit.
Вот тут мой код.
global $SelectPID
global $realBaseAddress = 0x00A5B90C
global $GA = 0x00A5BFCC
Dim $OPCODE = ""
Добавлено через 2 минуты
данный код работает везде - в мире, в данжах - мой патибот замечательно бегает за игроком)
Кому надо - могу код на шарпе дать, но код там точно такой же)
Dremalka
06.10.2011, 17:03
Побежал родимый!
semoder и N00bSa1b0t, спасибо вам большое за помощь. :)
N00bSa1b0t, сколько искал информацию по инжектам, не встречал такую, что через структуру действий можно гонять перса по координатам. Очень интересно. Обязательно попробую его реализовать.
Еще раз спасибо. :)
BritishColonist
06.10.2011, 17:58
а чему равно actionStruct?)
BA +1C +20 +?
N00bSa1b0t
06.10.2011, 20:35
а чему равно actionStruct?)
GameRun + HostPlayerStruct + playerActionStructOffset
то есть для руоффа:
0xA5BFCC + 0x20 + 0xFF4
не встречал такую, что через структуру действий можно гонять перса по координатам.
Я сам это первый раз увидел в FlyWQ =) Мне стало интересно как там это реализовано - способ простой очень и действенным оказался)
BritishColonist
06.10.2011, 23:08
MoveTo(X, Y, Z, moveType, client, actionStruct, height=-1.0)
а какие типы у параметров?
N00bSa1b0t
07.10.2011, 03:07
X Y Z - это ж координаты, по идее float. Хотя в самом FlyWQ это интовые числа. Но ведь размерность одинаковая (4 байта) поэтому одно и тоже значение можно интерпретировать и как float и как int32.
movetype всегда 1 (int32)
client - это просто ID процесса, с которым ты работаешь.
actionstruct - оффсет (int_ptr)
height - float
BritishColonist
07.10.2011, 15:13
хммм.. ну почему нельзя писать понятным образом?
что значит можно интерпретировать? окей, интерпретируем 3.14 как int: 1078523331. одинаковый результат? что-то не похоже, так что размерность - не показатель того, что пихать можно любые значения. важен смысл, а не размер.
movetype всегда 1 (int32)
что всегда 1? равен 1? тогда зачем делать из него параметр?
или занимает один байт? тогда зачем в скобочках приписано int32? int32 это простой стандартный int, т.е. целое, 4 байта.
и ещё. где логика порядка параметров? : D
Функция(координаты, тип движения, процесс игры, структура, высота)
я бы сделал так:
MoteTo(GameProcessId, Struct, Type, X, Y, Z, Height);
причём, зачем указывать начало структуры, если мы указываем процесс игры, из который это начало можно получить парой операций? ну неужели для экономии.. ресурсов?
в общем, я рад, что у тебя работает, но описано всё не очень понятно.
N00bSa1b0t
07.10.2011, 15:53
что значит можно интерпретировать? окей, интерпретируем 3.14 как int: 1078523331. одинаковый результат? что-то не похоже, так что размерность - не показатель того, что пихать можно любые значения. важен смысл, а не размер.
Смысл важен для человека. Если ты координаты считал как инт, и отправляешь как инт - все работает.
Я просто сказал, что в FlyWQ координаты представлены в виде инта:
xCoord8348 := 1150922672
xCoord8349 := 3302385319
xCoord8350 := 1148557837
xCoord8351 := 3303292969
xCoord8352 := 1142127397
Вот и все. Автору так было проще. Работает? Работает. Прилетел на точку, снял координаты - полетел дальше.
что всегда 1? равен 1? тогда зачем делать из него параметр?
или занимает один байт? тогда зачем в скобочках приписано int32? int32 это простой стандартный int, т.е. целое, 4 байта.
Зачем параметр - не знаю, спроси автора FlyWQ. Всегда равен 1, занимает 4 байта)
и ещё. где логика порядка параметров? : D
Опять-таки, вопрос не ко мне. Я лишь привел кусок исходника FlyWQ
PS
Если кто не понял, что такой FlyWQ - это вот это [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Правда в теме исходников нет, но вроде на пвлабе ссылка была.. или в другой какой-то теме, я успел скачать)
BritishColonist
07.10.2011, 16:09
а, так не ты это написал.. ну Ctrl+C'n'Ctrl+V это конечно круто : D
рекомендую всё же переписывать так, как удобно тебе, чтобы хотя бы понимать, что в этом коде происходит и как работает.
N00bSa1b0t
07.10.2011, 16:11
рекомендую всё же переписывать так, как удобно тебе, чтобы хотя бы понимать, что в этом коде происходит и как работает.
А я и переписал для себя) Я ж на шарпе пишу, а это AutoIt или что-то такое)
rsam
08.10.2011, 13:37
Зачем параметр - не знаю, спроси автора FlyWQ. Всегда равен 1, занимает 4 байта)
Опять-таки, вопрос не ко мне. Я лишь привел кусок исходника FlyWQ
setFlyTo(theId, xCoord, yCoord, zCoord, height)
{
global
local baseAddress := ReadMemory(realBaseAddress, theId)
local structurePointer := ReadMemory(baseAddress + baseOffset, theId)
local playerPointer := ReadMemory(structurePointer + playerOffset, theId)
local actionStruct := ReadMemory(playerPointer + playerActionStructOffset, theId)
MoveTo(Xcoord, Ycoord, Zcoord, 0, theId, actionStruct, height)
}единственный вызов приведенной вами функции, как видно в 4м параметре передается 0. откуда появилась 1 в этом параметре?
PS
Если кто не понял, что такой FlyWQ - это вот это [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Правда в теме исходников нет, но вроде на пвлабе ссылка была.. или в другой какой-то теме, я успел скачать)Исходники FlyWQ выложены автором тут ([Ссылки могут видеть только зарегистрированные и активированные пользователи]), включаемый файл тут ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
N00bSa1b0t
08.10.2011, 14:43
единственный вызов приведенной вами функции, как видно в 4м параметре передается 0. откуда появилась 1 в этом параметре?
Виноват, не туда посмотрел.
Но так как стоит комментарий
writeMemory(moveType, MoveAction + 0x2C, client) ;Not supported yet
то не думаю что это на что-то повлияет.
У меня в боте туда пишется 1 - и все равно все работает :)
Исходники FlyWQ выложены автором тут, включаемый файл тут
Не, я на том сайте был пару раз, значит исходник на пвлабе был)
BritishColonist
08.10.2011, 19:25
насчёт параметра. да, если игрок управляет персонажем, то movetype принимает следующие состояния:
при прыжке 4.
при передвижении клавишами 3.
при передвижении щелчками мыши 0.
если щёлкать мышью не на объект, а на небо (т.е. указываем просто сторону, в которую надо бежать), то movetype равен 2.
movetype никогда не равен 1. если прописать такое значение, передвигая игрока одним из вышеописанных способов, то он стопроцентно останавливается (даже при прыжке в небе зависнет, кстати). это кроме зажатия клавиш - у них значение 3 будет перезаписываться многократно, пока клавиши нажаты.
вот такие вот дела.
Обычно высота - (Z)
А (X,Y) - координаты на плоской поверхности.
так-то это так, но не в Perfect World /problem
логично и правильно выводить координаты в виде X, Y, Z, однако в том же d_showpos высота (Z) стоит на втором месте. не понятно, в чём фишка.
silk
10.10.2011, 15:48
фишка в том, что в мире 3D программ координаты X (длина) и Y (высота) находятся на плоскости, которая перед нами, а Z - это глубина. Так что с их точки зрения все правильно.
wajskopf
16.10.2011, 20:59
Все круто, наконец то потащился по координатам. Только вот почему-то не набирает высоту. Это у меня одного так?
imeninnik
13.11.2011, 13:49
Все круто, наконец то потащился по координатам. Только вот почему-то не набирает высоту. Это у меня одного так?
Цифры неизвестных параметров изменились. Полетал немного потыкался и нашел. Что выделено красным изменилось (при этом тип данных integer)
if(height >= 0.0)
{
writeMemory(71369729, MoveAction + 0x64, client)
writeMemory(0, MoveAction + 0x6C, client)
}
else
{
writeMemory(71369728, MoveAction + 0x64, client)
writeMemory(65536, MoveAction + 0x6C, client)
}
При наборе высоты в параметр height передается значение от 0 до 79, так же параметр Y(в данном случае высота) передается 0.
При отсутствии необходимости набрать высоту height=-1.0. так же в параметр Y может быть 0 а может быть и высота 0-790(тут не важно) .
Добавлено через 9 минут
данный код работает везде - в мире, в данжах - мой патибот замечательно бегает за игроком)
для следования за игроком можно использовать более простую функцию взятую вот тут ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
public void follow(int playerId)
{
int actionStruct = values.actionStructPointer;
int actionList = MemFunctions.MemReadInt(pr_processHandle, actionStruct + 0x30);
int followAction = MemFunctions.MemReadInt(pr_processHandle, actionList + 0x1C);
MemFunctions.MemWriteInt(pr_processHandle, actionStruct + 0xC, followAction); //Set new action at position 1
MemFunctions.MemWriteInt(pr_processHandle, actionStruct + 0x18, 1); //Set next action position to 1
MemFunctions.MemWriteInt(pr_processHandle, actionStruct + 0x14, followAction); //Set new action type follow as next action
}
sin(alpha)
19.11.2011, 20:51
координаты как то не ведут в те места куда их задаешь движется безостановочно по направлениям причем при типе движения 2 подставляя скажем 1 на Х движется на запад неостанавливаясь, 1 на Y - на север, иногда персонаж, что удивительно становится плоским, то есть какой-то из параметров отвечает за преобразование сетки моделей о_О
Надеюсь в данном случае повторение это мать учения, а не заикания =).
При наборе высоты в параметр height передается значение от 0 до 79, так же параметр Y(в данном случае высота) передается 0.
При отсутствии необходимости набрать высоту height=-1.0. так же в параметр Y может быть 0 а может быть и высота 0-790(тут не важно) .
Все что отмечено красным в коде это уже исправленное.
sin(alpha)
22.11.2011, 22:23
Если кто не заметил, то координаты специально приведены к более привычному виду Х, Y, Z, координата Z записывается в поле для Y и наоборот. Ходить по ним все равно отказывается и тупо бегает безостановочно в одну сторону. Про набор высоты я в курсе, это единственная вещь которая почему-то работает как сь старыми значениями так и с новыми как по высоте так и по (в моем коде)Z. А в плоскости по координатам ходить не желает.
Перегнал на шарп, теперь проблема как и с инжектами- падение клиента со светофором. С++ код не выбрасывает клиент а вот С# рушит намертво в чем дело не понятно.
структура кода как в оригинале. Красным выделены поля отвечающие за начало действия/конец действия. Судя по всему поля байтовые, чтение из них целого выдает фигю первое поле содержит 7FC14400 или 7FC14401 в зависимости от того активно действи или нет: второе 1E0FF400 никогда не меняется. Первое проще по моему выставлять битовой маской. Зеленым выделены значения в полях, отвечающих за высоту они походу тоже типа byte. А при попытке записать выделенное желтым, т.е. указатель на следующее действие клиент падает со светофором.
Вот снимки состояний при движении и остановке:
движение ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
остановка ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
кстати код на следование за игроком не вылетает, однако и не следует, а на месте стоит дергается только, там похоже еще надо инициировать структуру движения, только клиент при этом падает.
Преобразование координат:
Хчел=400+Хигр/10
Хиг = (Хчел-400)*10;
Zчел=550+Zигр/10
Zиг = (Zчел-550)*10;
так что ооба не верно написали.
Разобрался. Не корректно работают функции записи в память в PWFrameWorke, которым пользовался поначалу, загоняют по адресам нули вместо значений отсюда и глюки с вылетами. Первое что сделал - написал сканер структуры чисто на функциях WinAPI. Второе все значения флагов начало/останов выставлял через цепочку ПРОЧИТАЛ-ВЫСТАВИЛ_БИТ_ЧЕРЕЗ_ЛОГИЧЕСКИЕ_И/ИЛИ-ЗАПИСАЛ. С высотой все несколько сложнее эти два ее параметра по смещению MoveAction+64h и MoveAction+6Сh отвечают за инициацию автопилота. При этом второе поле обнуляется если идет изменение высоты если изменение высоты закончено - значение равно 10000h. У первого значения младший бит выставляется в 1 если автопилот включен, в 0 если выключен. При включенном автопилоте координата Y(у меня Z) должна быть равна 0. Где то должны еще находиться поля, хранящие координаты точки маркера автопилота, которая задается, при клике по НИП/мобу в квесте или по карте через альт. Для того, чтобы персонаж сам взлетал при задании ему высоты вместо координаты Y в поле 6Ch надо записать 100h.
Благодарный
14.12.2011, 15:16
Func AUTORUN($X, $Y, $Z, $PIDRUN)
$X = ($X - 400) * 10
$Y = ($Y - 550) * 10
$Z = $Z * 10
Local $RESULT, $PROCESS, $CODE_ADD, $THREAD, $PARAM_ADD
Local $PARAM = DllStructCreate("float [3]")
DllStructSetData($PARAM, 1, $X, 1)
DllStructSetData($PARAM, 1, $Z, 2)
DllStructSetData($PARAM, 1, $Y, 3)
$RESULT = DllCall("Kernel32.Dll", "int", "OpenProcess", "int", 2035711, "int", 0, "int", $PIDRUN)
$PROCESS = $RESULT[0]
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualAllocEx", "int", $PROCESS, "ptr", 0, "int", DllStructGetSize($PARAM), "int", 4096, "int", 64)
$PARAM_ADD = $RESULT[0]
$RESULT = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $PROCESS, "ptr", $PARAM_ADD, "ptr", DllStructGetPtr($PARAM), "int", DllStructGetSize($PARAM), "int", 0)
Local $FLY = 0
Local $MEMIDRUN = _MEMORYOPEN($PIDRUN)
Local $A = _MEMORYREAD(_MEMORYREAD(_MEMORYREAD($BASEADD1C, $MEMIDRUN) + 32, $MEMIDRUN) + $OFFSET_CHECK_FLY, $MEMIDRUN)
If $A = 2 Or $A = 1 Then
$FLY = 1
EndIf
$OPCODE = ""
PUSHAD()
MOV_EDX($BASEADD)
MOV_ECX_DWORD_PTR_EDX()
MOV_EDX_DWORD_PTR_ECX_ADD(28)
$OPCODE &= "8B7220"
MOV_ECX_DWORD_PTR_ESI_ADD(4084)
MOV_EAX_DWORD_PTR_ESI_ADD($OFFSET_CHECK_FLY)
PUSH(1)
MOV_EDX(4628224)
CALL_EDX()
MOV_EDI_EAX()
PUSH($PARAM_ADD)
PUSH($FLY)
MOV_ECX_EDI()
MOV_EDX(4645008)
CALL_EDX()
PUSH(0)
PUSH(1)
PUSH_EDI()
PUSH(1)
MOV_ECX_DWORD_PTR_ESI_ADD(4084)
MOV_EDX(4629312)
CALL_EDX()
POPAD()
RET()
INJECTCODE($PIDRUN)
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualFreeEx", "hwnd", $PROCESS, "ptr", DllStructGetPtr($PARAM), "int", DllStructGetSize($PARAM), "int", 32768)
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $PROCESS)
EndFunc
Раньше этот код отлично работал, а теперь игра сразу же вылетает при вызове функции :(
выложите рабочий код на AutoIt'e если у кого-нибудь он есть)
VeTaL_UA
14.12.2011, 15:25
Раньше этот код отлично работал, а теперь игра сразу же вылетает при вызове функции
А поменять оффсеты не пробовали?
Благодарный
14.12.2011, 15:50
"$BASEADD" и "$BASEADD1C" как они здесь названы- стоят актуальные для руоффа, а вот на счёт значения "$OFFSET_CHECK_FLY" не уверен...хотя пробовал и старое значение 1580 и предполагаемое новое 1688 под другим названием State_Offset из offset retriever'a
BritishColonist
03.01.2012, 15:50
У меня с обсуждаемой функцией такая проблема: вроде персонаж бегает нормально, но если подвинуть персонажа вручную (просто мышью или клавишами, а не через функцию), то он либо зависает, либо бежит на месте, либо после остановки вертится на одной точке вперёд-назад, как дурачок.
Никто не сталкивался?
wajskopf
11.01.2012, 00:38
С передвижением в полете проблемы с высотой((( не опускается и не поднимается. по плоскости движется нормально.