А зачем тебе знать этот ID?
Если атакует тебя, то таргет сам берется, если чужого персонажа (наверное, пишешь анти помощь окружающим?), то достаточно простого флага
Конечно, сам таргет не ставится, если бьют пета, но как только ты его вылечишь, моб переагрится на тебя.
я пишу баффера-помощника. оказывается есть еще одно смещение,указывающее на ячейку памяти, где находится ид ударившего магией. а знать нужно потому что в это время у мну в таргете член пати, которого я лечу. соответственно возникает ситуация- мну бьют магией, я его не вижу, соответственно никаких мер не предпринимаю, и рано или поздно оказываюсь чуть-чуть мертвым. а так прикольно получается- моб еще не ударил- а я уже знаю ,если что- сваливаю.
что-то не получается у меня получить указатель на массив . помогите разобраться.если можно на пальцах.
вот смещения
DWORD MobAtackIDFiz = 0x2C4; // Смещение к адр.Прицела Моба ID цели Моба (физ урон)
DWORD MobAtackIDMag = 0x2C8; // Смещение к адр.Прицела Моба ID цели Моба -(маг урон)
Люди, подскажите пожалуйста, как можно найти цепочку оффсетов для начала блока данных о мобе. Если это уже обсуждалось, пожалуйста скажите номер поста или примерно страницы. Так же мне очень бы хотелось узнать как самому находить оффсеты для каких то значений например о персонаже, если я знаю оффсет для начала блока. Тоесть допустим мы имеем [BA] + 20, а как мы дальше узнаем, что допустим + 464 - это HP, а 468 это MP и т.д.
Помогите разобраться с массивом баффов, которые наложены на перса.По +354 есть этот массив, но ИД наложенных бафов отличается от ИД, которое в описателе скила.
как я понял, там 2-х байтовые числа. кроме того, к примеру, тот же "совет бессмертного" накладывает сразу два баффа. Просто хочу сделать ребафф не по таймеру, а по наличию-отсутствию баффа.( после смерти ведь баффы сбрасываются)
Да и антистан в нужный момент тоже не помешал бы.
Составь таблицу с ID бафов. Как вариант.)
Поздравьте меня, в течении 4-х долгих суток фарма в 4 окна удалось насобирать на феню.
И сразу же обнаружилось ряд недостатков.
Например, этот петух жареный, как и все летающие петы, постоянно застревает в земле. Поэтому приходится каждый раз жать мышкой "следовать", что совсем не удобно.
Появляется ряд вопросов: есть ли у кого инжект кнопки следовать, стоять, и желательно атаки и скиллов пета? Альт+1 тянуться использовать не удобно, а через PostMessage реализовать так и не удалось..
поздравляю. как вариант- используй атаку с воздуха, после каждой атаки поднимайся немного над землей. в данное время усиленно копаю в сторону функции "помощь в атаке" (такое же действие как идти к.. следовать..) а через PostMessage реализовать можно, только ведь есть инжект "атака петом". адрес где-то пробегал. вок как сделаю помощь в атаке - тоже займусь скилами Пэта.......
Неудобно перед каждым мобом прыгать) Хотя если действительно с воздуха бить...и друидкой ничего не делать.. Ведь феня убивает в два раза быстрее чем хозяйка.
На счет PostMessage, пример выкладывал AlexGD, якобы рабочий.. Но этот код даже эскейп не посылает).. не говоря уже об Альт.
чтобы передать Альт+1 надо PostMessage со всеми параметрами передавать и составить правильно маску флагов. PostMessage реально любую комбинацию передавать.
Посмотри на исходниках.ру. там даже с примерами
slavapil. не сочти за наглость, но мож поделишся кодом? хотя бы инфой что и куда запихивать?
Ну, блин, не думал, что такой гемор будет с отправкой кнопочек клиенту. Причем пока всякие циферки и Ф-ки отправлял - все отлично было. А вот захотелось мне сделать процедуру экстренного свала из под огня. Ну, говорю, клиент . Жмакни мне тильдочку. А он мне в ответ - ты чо - сдурел шоли? Я тебе чо - текстовый редактор тильдочки жмакать? И вот тут у танка отвалилась башня. То нажимает, то не нажимает, то язык ему не тот. и т.д. и т.п. Короче проимелся я более 10 часов...
Вот вам результат... Может кому полезно будет...
Code:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ procedures to send key pressing to client
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TaPWT.SendKey(aWindowHandle: HWND; aPWThreadID: Cardinal; Key: Word; const Shift: TShiftState; SpecialKey, EngLayout: Boolean);
type
TBuffers = array [0..1] of TKeyboardState;
var
pKeyBuffers: ^TBuffers;
lParam: LongInt;
Layout, tLayout: Cardinal;
i: integer;
begin
if EngLayout then
begin
Layout := LoWord(GetKeyboardLayout(aPWThreadID));
PostMessage(aWindowHandle, WM_INPUTLANGCHANGEREQUEST, 0, $00000409);
end;
Sleep(20);
AttachThreadInput(aPWThreadID, GetCurrentThreadId, true);
sleep(20);
pKeyBuffers := nil;
lParam := MakeLong(0, MapVirtualKey(Key, 0));
if SpecialKey then
lParam := lParam or $1000000;
New(pKeyBuffers);
try
GetKeyboardState(pKeyBuffers^[1]);
FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);
if ssShift in Shift then
pKeyBuffers^[0][VK_SHIFT] := $80;
if ssAlt in Shift then
begin
pKeyBuffers^[0][VK_MENU] := $80;
lParam := lParam or $20000000;
end;
if ssCtrl in Shift then
pKeyBuffers^[0][VK_CONTROL] := $80;
SetKeyboardState(pKeyBuffers^[0]);
if ssAlt in Shift then
begin
PostMessage(aWindowHandle, WM_SYSKEYDOWN, Key, lParam);
PostMessage(aWindowHandle, WM_SYSKEYUP, Key, lParam or $C0000000);
end
else
begin
PostMessage(aWindowHandle, WM_KEYDOWN, Key, lParam);
PostMessage(aWindowHandle, WM_KEYUP, Key, lParam or $C0000000);
end;
sleep(50);
Application.ProcessMessages;
SetKeyboardState(pKeyBuffers^[1]);
finally
if pKeyBuffers <> nil then
Dispose(pKeyBuffers);
end;
AttachThreadInput(aPWThreadID, GetCurrentThreadId, false);
sleep(20);
if EngLayout then
for I := 1 to 10 do
if Layout <> LoWord(GetKeyboardLayout(aPWThreadID)) then
begin
PostMessage(aWindowHandle, WM_INPUTLANGCHANGEREQUEST, 0, Layout);
Sleep(20);
end
else
break;
end;
procedure TCharForm.Button5Click(Sender: TObject);
begin
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VK_ESCAPE, [], false, true);
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VkKeyScan('~'), [ssShift], false, true);
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VK_DOWN, [], false, true);
aPWT.TextToClipboard('exit');
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VkKeyScan('v'), [ssCtrl], false, true);
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VK_RETURN, [], false, true);
end;
Как видишь, тут Алекс отчаянно использует эти самые параметры) Уверяет, что работает.. Может стоит тебе проверить? - вдруг это я что-то не учел.
Адрес инжекта да.. пробегал. А код к нему нет) Есть одна статья (на русском), где собирались пояснить, как самому писать инжекты, но так и не собрались..