#251 03-11-2015 23:18

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Вопрос по памяти

1. не sizeof (4), а просто 4 - иначе это может быть значение от 1 до 8, в зависимости от того, какой тип для 4 предложит компилятор
2. насколько я понимаю, читается g_pPlayerVehicle->m_pHandling->m_dwIndex. формально - все правильно

1) p1 нужно проверять на NULL (находится ли игрок в машине - иначе получим GPF, если он идет пешком)
2) за давностью лет, я не помню, что там с индексами. Если я вспомнил правильно, 188 - это hotdog.

Offline

#252 11-11-2015 18:40

zorin_chel
From: Челябинск
Registered: 27-09-2010
Posts: 18
Website

Re: Вопрос по памяти

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

int* ReadPointer (DWORD base, int offsets [], int level)

{
	int* pointer = (int*)base;
	for (int i = 0; i < level; i++)
	{
		pointer = (int*)(*pointer + offsets[i]);
		printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer);
	}
	return pointer;
}

осталось только рабочее шасси доделать

#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#include <tlhelp32.h>
#pragma comment(lib, "winmm")

using namespace std; 
 
DWORD WINAPI GtaSA_thread (LPVOID);
 
 
 
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved)
 
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return true;
}
 

void CreateConsole ()

{
int hConHandle = 0;
HANDLE lStdHandle = 0;
FILE *fp = 0;
AllocConsole ();
SetConsoleTitle ("ID   ");
lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT);
fp = _fdopen (hConHandle, "w");
*stdout = *fp;
setvbuf (stdout, NULL, _IONBF, 0);
}




int* ReadPointer (DWORD base, int offsets [], int level)

{
	int* pointer = (int*)base;
	for (int i = 0; i < level; i++)
	{
		pointer = (int*)(*pointer + offsets[i]);
		printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer);
	}
	return pointer;
}

void MEMwrite(void *adr, void *ptr, int size)
{
DWORD OldProtection;
VirtualProtect(adr,size,PAGE_EXECUTE_READWRITE, &OldProtection);
memcpy(adr,ptr,size);
VirtualProtect(adr,size,OldProtection, &OldProtection);
}

DWORD WINAPI GtaSA_thread (LPVOID)

{
	int* pointer0 = 0;
	DWORD base = 0xBA18FC;
	int offsets[1] = { 0x00 };
	pointer0 = ReadPointer (base, offsets, 0);

    

	DWORD*var =  (DWORD*)(0x6CC3B2);
	DWORD*var2 = (DWORD*)(0x6C9103);
    DWORD*var3 = (DWORD*)(0x406AF3);
	DWORD*var4 = (DWORD*)(0x6c9690);
	DWORD*var5 = (DWORD*)(0x6C9F1C);
    DWORD*var6 = (DWORD*)(0x6C8F10);
	
	   
	


    CreateConsole ();
    for (;;Sleep (100))
	{


		if (*pointer0)

		{

		 int offsets[2] = { 0x384, 0x00 };
            

		 int* pointer = 0;
	   	 pointer = ReadPointer (base, offsets, 2);


	
		
		
		       if (*pointer == 188)
			   {

				   *var  = 0x01DCF981;
				   *var2 = 0x01DC227E;
				   *var3 = 0x01DC227E;
                   *var4 = 0x01DC227E;
                   *var5 = 0x01DC3D66;
                   *var6 = 0x01DCFF81;


	//			MEMwrite ((void*)(adr), (void*)"1", 1);
	//			MEMwrite ((void*)(adr2), (void*)"1", 1);
			
			   }else

			   {
			       *var  = 0x0208F981;
				   *var2 = 0x0208227E;
				   *var3 = 0x0208227E;
                   *var4 = 0x0208227E;
                   *var5 = 0x02083D66;
                   *var6 = 0x0208FF81;
			   }

		}

	
	}


}

работает так: когда сел в rustler в нем появляются функции hydra (вертикальный взлет/посадка), когда сел в hydra ее функции возвращаются

Offline

#253 13-01-2016 06:37

SR_team
Registered: 20-09-2014
Posts: 4

Re: Вопрос по памяти

Какую функцию вызвать, что бы рисовался мир? Хочу сделать прозрачное меню. Пол ночи парился и все чего добился - это смог отключить стандартный задний фон меню занопив вызов по адресу gta_sa.exe+327BB1

Offline

#254 13-01-2016 23:38

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Обращайся к ThirteenAG(он же - Sergey81 на этом форуме) - он уже реализовал эту функцию в своём Widescreen fix.

Offline

#255 27-04-2016 04:22

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Важный вопрос(здесь я вроде уже спрашивал, но продублирую ввиду важности вопроса и объяснения деталей): как вернуть игроку управление во время катсцены?
Это точно возможно, но мне пока это не удалось(все скриптовые методы перепробовал), хотя есть зацепка: вот тут чувака(я связался с ним, и он рассказал) арестовали во время катсцены, он зареспавнился, и управление к нему вернулось!
Короче, если во время катсцены вернуть игроку камеру, т.е.

Camera.SetBehindPlayer
Camera.Restore_WithJumpCut

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

01B4: set_player $PLAYER_CHAR can_move 1

- не работают, однако у чувака, о котором я написал выше - управление вернулось.
Т.е., ключ к полному возвращению управления игроку лежит в респауне игрока после ареста(и возможно - смерти), но я за несколько лет так и не смог разобрать это.
Если получится вернуть управление игроку, то открываются просто безграничные возможности в визуализации миссий/фриплея.
Пока удаётся сделать лишь уныленькую "эмуляцию" управления, а хотелось бы полноценный контроль над игроком.

P.S. Только представьте сцены с подобными чудищами, но с возможностью управлять игроком!
P.P.S. Катсценовые анимации можно зацикливать, у катсценовых персонажей - создавать скелеты с новой иерархией и большим кол-вом костей, чем в оригинале, можно создавать огромные анимированные сцены, как в новом Quantum Break и вообще кучу всего!
Необходимо лишь расковырять этот проклятый респаун игрока и понять, как в этом случае возвращается управление игроку, но я тут бессилен...

Last edited by Shag (27-04-2016 16:09)

Offline

#256 30-04-2016 03:06

wmysterio
Registered: 04-03-2011
Posts: 215
Website

Re: Вопрос по памяти

Shag wrote:

Важный вопрос(здесь я вроде уже спрашивал, но продублирую ввиду важности вопроса и объяснения деталей): как вернуть игроку управление во время катсцены?
Это точно возможно, но мне пока это не удалось(все скриптовые методы перепробовал), хотя есть зацепка: вот тут чувака(я связался с ним, и он рассказал) арестовали во время катсцены, он зареспавнился, и управление к нему вернулось!
Короче, если во время катсцены вернуть игроку камеру, т.е.

Camera.SetBehindPlayer
Camera.Restore_WithJumpCut

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

01B4: set_player $PLAYER_CHAR can_move 1

- не работают, однако у чувака, о котором я написал выше - управление вернулось.
Т.е., ключ к полному возвращению управления игроку лежит в респауне игрока после ареста(и возможно - смерти), но я за несколько лет так и не смог разобрать это.
Если получится вернуть управление игроку, то открываются просто безграничные возможности в визуализации миссий/фриплея.
Пока удаётся сделать лишь уныленькую "эмуляцию" управления, а хотелось бы полноценный контроль над игроком.

P.S. Только представьте сцены с подобными чудищами, но с возможностью управлять игроком!
P.P.S. Катсценовые анимации можно зацикливать, у катсценовых персонажей - создавать скелеты с новой иерархией и большим кол-вом костей, чем в оригинале, можно создавать огромные анимированные сцены, как в новом Quantum Break и вообще кучу всего!
Необходимо лишь расковырять этот проклятый респаун игрока и понять, как в этом случае возвращается управление игроку, но я тут бессилен...

Прочитал я это и ржал, особенно над выражением "открываются просто безграничные возможности". Какие ещё возможности??? Каким же образом Вы думаете делать "огромные анимированные сцены"? При всём уважении, но мне кажется, что это просто лёгкий способ водить себя за нос.

Offline

#257 30-04-2016 07:25

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

wmysterio > Я же видео примеры привел: раз и два.
В первом, показан интегрированный прямо в катсцену геймплей: половина зомбов, а также ржавые автомобили - катсценовые, т.е. катсцена позволяет нестандартно анимировать персонажей и объекты.  Управление игроком там скриптовое, т.е. из-за невозможности управлять игроком(как я и писал выше, никак не получается "расфризить" игрока скриптовыми методами) мне пришлось писать скрипт "управления игроком", т.е. "сэмулировать" управление. А как было бы прекрасно управлять игроком полноценно...
Второе видео показывает, что в катсценах можно использовать персонажей с новой скелетной иерархией и с большим кол-вом костей, чем в оригинальной игре. Если будет запилено возвращение управление игроку, можно сделать всевозможных монстров с 10 ногами и кучей щупалец. Это просто пример, если что. Возможности действительно безграничны. Я знаю как и могу сделать сцену, как в предложенном видео по Quantum Break . Не 1в1(естественно), но с кучей анимированных деталей с возможностью бегать по ним и прочее. Вот только будет очень уныло, если управление игроком так и не удастся вернуть и мне придется писать скрипт-надстройку для этого.
Надеюсь, всё разъяснил.

Last edited by Shag (30-04-2016 07:30)

Offline

#258 11-05-2016 15:49

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Вот запилил еще пример интеграции геймплея в катсцену(или наоборот): пример "анимированных сцен", о которых писалось ранее.
Управление, как и в предыдущем случае - искусственное, скриптовое, "деревянное".
Если кто-нибудь поможет с возвращением управления к игроку, подобные вещи станут в 1000 раз эффектнее...

Last edited by Shag (11-05-2016 15:51)

Offline

#259 07-06-2016 22:43

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Shag wrote:

как вернуть игроку управление во время катсцены?

Вопрос для Vice City решен(спасибо DK!) - нужно занопить 16 байт по адресу 0x40703E, т.е.

0A8C: write_memory 0x40703E size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x407042 size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x407046 size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x40704A size 4 value 0x90909090 virtual_protect 0

Offline

#260 09-06-2016 08:59

Mr.GeniusZ
Registered: 09-11-2014
Posts: 29

Re: Вопрос по памяти

Shag wrote:
Shag wrote:

как вернуть игроку управление во время катсцены?

Вопрос для Vice City решен(спасибо DK!) - нужно занопить 16 байт по адресу 0x40703E, т.е.

0A8C: write_memory 0x40703E size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x407042 size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x407046 size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x40704A size 4 value 0x90909090 virtual_protect 0

А для саньки те же адреса?

Offline

#261 09-06-2016 11:14

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Mr.GeniusZ wrote:

А для саньки те же адреса?

Я не смог найти. Дело в том, что в Вайсе игрок блочится в опкоде

02E4: load_cutscene_data 'ololo'

да блочится так, что не помогает даже

01B4: set_player $PLAYER_CHAR can_move 1

Поэтому-то и пришлось ковырять память. А в СА в структуре опкода я блок игрока не нашел, поэтому хз... Я мало знаю о СА - там действительно, как в Вайсе, разблочить управление не помогает опкод 01B4? Т.е. после запуска катсцены, минимум через 0 мс запустить код:

02A3: enable_widescreen 0
Camera.SetBehindPlayer
015A: restore_camera 
01B4: set_player $PLAYER_CHAR can_move 1

Т.к. блокировки управления в опкоде 02E4 в СА я не нашел - это должно работать...

Offline

#262 09-06-2016 11:53

Mr.GeniusZ
Registered: 09-11-2014
Posts: 29

Re: Вопрос по памяти

Shag wrote:
Mr.GeniusZ wrote:

А для саньки те же адреса?

Я не смог найти. Дело в том, что в Вайсе игрок блочится в опкоде

02E4: load_cutscene_data 'ololo'

да блочится так, что не помогает даже

01B4: set_player $PLAYER_CHAR can_move 1

Поэтому-то и пришлось ковырять память. А в СА в структуре опкода я блок игрока не нашел, поэтому хз... Я мало знаю о СА - там действительно, как в Вайсе, разблочить управление не помогает опкод 01B4? Т.е. после запуска катсцены, минимум через 0 мс запустить код:

02A3: enable_widescreen 0
Camera.SetBehindPlayer
015A: restore_camera 
01B4: set_player $PLAYER_CHAR can_move 1

Т.к. блокировки управления в опкоде 02E4 в СА я не нашел - это должно работать...

Прочекал, блокировка все-таки есть, и адреса с вайса не подходят...

Last edited by Mr.GeniusZ (09-06-2016 11:54)

Offline

#263 09-06-2016 22:27

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Вопрос по памяти

Shag wrote:
Shag wrote:

как вернуть игроку управление во время катсцены?

Вопрос для Vice City решен(спасибо DK!) - нужно занопить 16 байт по адресу 0x40703E, т.е.

0A8C: write_memory 0x40703E size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x407042 size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x407046 size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x40704A size 4 value 0x90909090 virtual_protect 0

Молодцы! Только virtual_protect наверно должен быть равен 1, ведь это область памяти read-only.

Offline

#264 10-06-2016 11:16

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Seemann wrote:

Молодцы! Только virtual_protect наверно должен быть равен 1, ведь это область памяти read-only.

Спс за инфу, но как это вообще узнается(на будущее)? Я просто ставлю virtual_protect 1 только если не работает virtual_protect 0, а в этом случае 0 работает

Last edited by Shag (10-06-2016 11:17)

Offline

#265 10-06-2016 11:37

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Вопрос по памяти

virtual protect ставится для кода так как он защищен от изменения, а для обычных значений где хранятся данные - 0.


I know everything and nothing...

Offline

#266 10-06-2016 11:52

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Так вот я и не пойму - ведь в этом случае и без virtual protect работает...

Offline

#267 11-06-2016 08:47

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Апдейт(чтобы добить тему возвращения управления в катсценах): чтобы вернуть возможность заходить в меню во время катсцены(когда мы уже вернули управление методом, описанным выше), нужно выставить 0 по адресу 0xA10B63, т.е.

0A8C: write_memory 0xA10B63 size 1 value 0 virtual_protect 1

Применять ПОСЛЕ запуска катсцены, МИНИМУМ через 0ms после оного. После каждого отключения катсцены(а вернее - при каждом новом запуске) значение нужно выставлять заного.
Почему бы не заблочить адрес в этом значении навсегда(или занопить его изменение)?
Ответ: в этом случае катсцены будут некорректно запускаться, так что лучше этого не делать, и менять значение каждый раз после запуска катсцены.
Таким образом, можно спокойно лазить по меню во время проигрывания катсцены(если разморозить(0) мир по адресу 0xA10B36). Скоро это появится в Main Menu Scene grin

Last edited by Shag (11-06-2016 08:50)

Offline

#268 14-06-2016 15:15

Mr.Secret
Registered: 21-05-2014
Posts: 11

Re: Вопрос по памяти

Есть ли возможность заставить игру загрузить файл внешних скриптов в процессе выполнение самого .scm файла? Надо для мпака. Я точно помню, что есть какая-то функция для загрузки .img файла. Вроде, в базе для иды видел.
Я знаю, что есть патч от Seemann, но всё-таки предпочтительнее было бы загрузить прямо из скм, а не менять экзешник.

Offline

#269 10-10-2016 16:36

Mr.GeniusZ
Registered: 09-11-2014
Posts: 29

Re: Вопрос по памяти

По какому адресу можно узнать активно ли меню настроек звука в GTA III?

Offline

#270 16-10-2016 18:39

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Вопрос по памяти

Mr.GeniusZ wrote:

По какому адресу можно узнать активно ли меню настроек звука в GTA III?

Поищи тут.
Даже если конкретно этого нет - возможно, найдешь что-то похожее или сможешь спросить в той теме(тебе нужен адрес Menu ID).

Last edited by Shag (16-10-2016 18:40)

Offline

#271 03-05-2018 01:13

Kostyan
Registered: 27-09-2009
Posts: 94

Re: Вопрос по памяти

Всем привет. Помогите решить проблему.

+1300 = [dword] Alternate siren (honking):
0 = off
1 = on
Note: Automatically gets reset back to 0. To prevent this just NOP 0x6E0A3B (6 bytes).

(адрес активирует на машине клаксон)
Собственно всё работает, но, чтобы сигнал не прерывался код нужно зацикливать, а мне это не желательно. Объясните как использовать последнюю строчку, чтобы не зацикливать скрипт.

Offline

#272 03-05-2018 23:00

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Вопрос по памяти

@Kostyan

0A8C: write_memory 0x6E0A3B size 6 value 0x90 virtual_protect 1

I know everything and nothing...

Offline

Board footer

Powered by FluxBB