#226 01-07-2014 19:08

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

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

Начнем с того, как ты узнаешь "есть ли в модели компонент chassis и прочитать координаты этого компонента" для уже созданной машины?

Offline

#227 02-07-2014 05:49

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 252

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

для уже созданной машины вот так:

...
0A97: 1@ = car 0@ struct
0A8E: 2@ = 1@ + 0x64C // chassis  
0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0  
if
  2@ > 0
then
    2@ += 64
    0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 
    2@ += 4
    0A8D: 4@ = read_memory 2@ size 4 virtual_protect 0
    2@ += 4
    0A8D: 5@ = read_memory 2@ size 4 virtual_protect 0
end
...

Offline

#228 05-07-2014 01:34

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

По смещению +0x1C в структуре CVehicleModelInfo хранится указатель на RpClump.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#229 05-07-2014 11:29

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

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

По смещению +0x1C в структуре CVehicleModelInfo хранится указатель на RpClump.

CVehicleModelInfo это то, о чем я написал тут?

Offline

#230 05-07-2014 12:35

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 252

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

DK22Pac wrote:

По смещению +0x1C в структуре CVehicleModelInfo хранится указатель на RpClump.

Это я понял из предыдущего сообщения Seemann
Как это правильно использовать, что-то торможу   wall
Вот такая запись приводит к вылету игры. Просьба поправить код:

0A90: 0@ = #CEMENT * 4
0@ += 0xA9B0C8
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
0@ += 0x1C
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0
0AA7: call_function 0x4C5400 num_params 2 pop 2 _nodename "chassis" _rwObject 1@ _store_to 2@

Offline

#231 05-07-2014 12:57

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

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

kenking
я тоже пока не разобрался до конца. Указатель 0x1C изначально равен 0, поэтому происходит вылет. Но если перед этим создать машину с такой моделью (#CEMENT), то код должен работать.

Естественно это не то, что требовалось, будем думать дальше.

Offline

#232 05-07-2014 15:32

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

Seemann wrote:

По смещению +0x1C в структуре CVehicleModelInfo хранится указатель на RpClump.

CVehicleModelInfo это то, о чем я написал тут?

В принципе, да. Это наследуемый от CBaseModelInfo класс (который у тебя CModelBase).
Seemann, а если просто перед этим загрузить модель (без создания машины)?
kenking, не забывай проверять <> 0.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#233 05-07-2014 15:43

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 252

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

DK22Pac wrote:

kenking, не забывай проверять <> 0.

Проверял, конечно (после 0AA7:), в посте код сокращённый просто написал

DK22Pac wrote:

а если просто перед этим загрузить модель (без создания машины)?

Да такой вариант работает.

Seemann, DK22Pac, спасибо. good

Кстати, про выгрузку моделей (Model.Destroy(#CEMENT)) - кто-то выгружает модели после использования в коде, кто-то нет. Я, например, всегда выгружаю. Так ли необходимо на самом деле?

Last edited by kenking (05-07-2014 16:33)

Offline

#234 17-08-2014 16:58

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

Модель надо выгружать, если ты её загружал. Так правильно.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#235 06-11-2014 20:34

IlyaLion
Registered: 11-07-2011
Posts: 7

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

В структуре транспорта есть такое смещение: +0x3A6 = [word] ID следующей точки пути.
А можно ли найти id (или координаты) нескольких последующих точек пути?

Offline

#236 25-11-2014 20:11

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 937
Website

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

Игра планирует движение машины только на одну точку вперёд.
Но если машина едет по прямой, а не находится на перекрёстке, то можно просто определить координаты нескольких ближайших точек того пути, на котором она находится в данный момент.
Для этого можно применить опкод:
04D3: get_nearest_car_path_coords_from $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD type 2 store_to 88@ 89@ 90@
Здесь "direction" - это степень удаленности точки пути от указанных координат (если указать 1, то найдётся ближайшая к координатам точка, 2 - вторая по близости точка, 3 - третья по близости точка и т.д.)

Offline

#237 26-11-2014 12:52

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

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

Встречный вопрос, можно узнать о ближайшей точке, например, перекресток это или нет?


I know everything and nothing...

Offline

#238 26-11-2014 15:43

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

Вроде есть такое во флагах.
http://gtamodding.ru/wiki/Пути_(GTA_SA) … ionInfo.29


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#239 28-11-2014 12:16

IlyaLion
Registered: 11-07-2011
Posts: 7

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

Den_spb wrote:

Игра планирует движение машины только на одну точку вперёд.
Но если машина едет по прямой, а не находится на перекрёстке, то можно просто определить координаты нескольких ближайших точек того пути, на котором она находится в данный момент.
Для этого можно применить опкод:
04D3: get_nearest_car_path_coords_from $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD type 2 store_to 88@ 89@ 90@
Здесь "direction" - это степень удаленности точки пути от указанных координат (если указать 1, то найдётся ближайшая к координатам точка, 2 - вторая по близости точка, 3 - третья по близости точка и т.д.)

Но здесь нет direction. Возможно, Вы имели в виду 06F8: get_nearest_route_for 62@ 63@ 64@ in_direction 1 store_to 342@ 343@ 344@ Z_angle_to 345@ ?

Offline

#240 29-11-2014 12:45

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 937
Website

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

Да, опечатался:

06F8: get_nearest_route_for 62@ 63@ 64@ in_direction 1 store_to 342@ 343@ 344@ Z_angle_to 345@

Вот, нашёл у себя в запасах простой экспериментальный скрипт, подсвечивающий 10 ближайших к игроку точек путей машин:

{$CLEO}
wait 2000
while true
    wait 0
    if
        not player.Defined($player_char)
    then
        continue
    end
    actor.StorePos($player_actor 0@ 1@ 2@)
    31@ = 0
    for 30@ = 1 to 10
        06F8: get_nearest_route_for 0@ 1@ 2@ in_direction 30@ store_to 6@ 7@ 8@ Z_angle_to 3@
        8@ += 1.0 
        016F: create_particle 3 rotation_factor 0.0 size 2.0 intensity 255 flags 31@ 0 255 at 6@ 7@ 8@
        0656: get_angle 3@ absolute_degrees_to 3@ 
        02F6: 4@ = sine 3@ // (float) 
        02F7: 5@ = cosine 3@ // (float)
        4@ *= 2.0
        5@ *= 2.0
        005B: 7@ += 5@ // (float) 
        0063: 6@ -= 4@ // (float)  
        016F: create_particle 3 rotation_factor 0.0 size 1.0 intensity 255 flags 0 0 255 at 6@ 7@ 8@
        0092: 3@ = float 3@ to_integer
        31@ += 25
    end
end 

Last edited by Den_spb (29-11-2014 12:47)

Offline

#241 09-08-2015 12:50

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

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

Существует ли т.н. лимит "видеопамяти" по аналогии с лимитом "Streaming memory" в Vice City?
Дело в том, что работаю над несколькими глобалками(двумя своими и двум чужим помогаю), и во всех так или иначе начала появляться проблема "перегруженности сцены": когда рендерится слишком много высокополигональных/HQ-текстурных объектов, часть текстур начинает пропадать(становятся белыми), либо начинают глючить текстуры с альфой.
Никакие limit adjuster-ы не помогают, даже если повышать все возможные и не возможные лимиты. Также дело не в компьютерах, т.к. проблема одинакого проявляется и на мощных, и на слабых компах, с видюхами разных производителей и т.д.
Отсюда и появилось подозрение на "внутренний" лимит видеопамяти.

Если кто знает адресок - он буквально спасет 4 проекта  smile
P.S. Вопрос именно по Vice City, т.к. такие проблемы проявляются только в нем.

Last edited by Shag (09-08-2015 13:04)

Offline

#242 09-08-2015 17:23

wmysterio
From: Ukraine
Registered: 04-03-2011
Posts: 189
Website

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

Shag wrote:

Существует ли т.н. лимит "видеопамяти" по аналогии с лимитом "Streaming memory" в Vice City?
Дело в том, что работаю над несколькими глобалками(двумя своими и двум чужим помогаю), и во всех так или иначе начала появляться проблема "перегруженности сцены": когда рендерится слишком много высокополигональных/HQ-текстурных объектов, часть текстур начинает пропадать(становятся белыми), либо начинают глючить текстуры с альфой.
Никакие limit adjuster-ы не помогают, даже если повышать все возможные и не возможные лимиты. Также дело не в компьютерах, т.к. проблема одинакого проявляется и на мощных, и на слабых компах, с видюхами разных производителей и т.д.
Отсюда и появилось подозрение на "внутренний" лимит видеопамяти.

Если кто знает адресок - он буквально спасет 4 проекта  smile
P.S. Вопрос именно по Vice City, т.к. такие проблемы проявляются только в нем.

А ещё может есть опкод, который увеличивает размер оперативной памяти или чтобы объём винчестера увеличился на 1.5 гига? Простите, не удержался grin

Ну не знаю, любая программа берёт ровно столько ресурсов, сколько нужно и этот общий "лимит" варьируется в зависимости от уже нанятых ресурсов. Мне кажется, проблема здесь не в лимитах а как раз в железе или самой программе.

Offline

#243 10-08-2015 20:46

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

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

Повторюсь, проблема одна и та же на совершенно разном по мощностям железе(от компов, тянущих гта са с тормозами, до тех, что жрут гта4 на максималках): просто на медленных компах к тому же еще и тормозит(ну это понятно, почему).
wmysterio, я может и некорректно задал вопрос, но тебя же не удивляет наличие лимитов "Streaming memory" в гта-шках - почему же удивляет то, что я спросил?
"Streaming memory" - это по сути лимит возможной загрузки оперативки, а я ищу аналог для видеокарты.

Last edited by Shag (10-08-2015 20:47)

Offline

#244 25-10-2015 07:37

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

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

помогите пожалуйста, вопрос такой
в IDA базе есть такой участок

.text:006CB4F3
.text:006CB4F3     loc_6CB4F3:                             ; CODE XREF: CPlane__processControlInput+611j
.text:006CB4F3                                             ; CPlane__processControlInput+636j
.text:006CB4F3                                             ; CPlane__processControlInput+64Dj
.text:006CB4F3                                             ; CPlane__processControlInput+688j ...
.text:006CB4F3 024                 cmp     word ptr [esi+22h], 208h

во вкладке HEX он выглядит так

006CB4F3  66 81 7E 22 08 02 0F 85  EB 00 00 00 57 E8 6B 46

меня интересует конкретно строка
.text:006CB4F3 024                 cmp     word ptr [esi+22h], 208h //здесь происходит сравнение с id 520 (гидра)
так вот, в exe (если открыть в hex-редакторе) или открыть запущенный процесс этот участок выглядит совсем не так
F7 FF FF 90 E9 F8 B5 D3 FF 0F 85 EB 00 00 00 57
наглядно
https://yadi.sk/d/1UKc1vIpjybDr
мне нужно выполнить сравнение не с 208h, а с другим числом, как его вычислить?

Last edited by zorin_chel (26-10-2015 20:04)

Offline

#245 25-10-2015 10:36

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

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

У вас стоит какой-то плагин или клео скрипт, который записывает по этому адресу свой код. там появились новые команды nop и jmp Т.е. оригинальной проверки номера модели там уже нет.

По поводу 208h - это число 520 в шестнадцатиричной системе счисления, вычислить можно в обычном калькуляторе Windows: режим программист, выбираем Dec, пишем число, выбираем Hex.
http://www.cavestory.org/guides/csasm/guide/hex2.html

Offline

#246 25-10-2015 10:55

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

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

я их специально красным подсветил, чтобы указать что это одно и тоже, тогда такой вопрос, как найти адрес, который управляет шасси id520
пытаюсь написать плагин, который делает из другого самолета гидру,

#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>
#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);
}



DWORD WINAPI GtaSA_thread (LPVOID)
{
	 

	 DWORD*var = (DWORD*)(0x6CC3B2);
	 DWORD*var2 = (DWORD*)(0x6C9103);

	// DWORD*var3 = (DWORD*)(0x6C9103);

	*var  -= 0x2c0000;
	*var2 -= 0x2c0000;

	
WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL);


     	
	{

		 for (;;Sleep (1000))           
		
	return 0;

	 
	}
	            

}

пока получилось только это
https://www.youtube.com/watch?v=cMMd7vroo9A
в каком направлении дальше двигаться?

Last edited by zorin_chel (25-10-2015 12:23)

Offline

#247 25-10-2015 12:10

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

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

установил чистую gta, там значение адресов такое же

006CB4F3 90 E9 F8 B5 D3 FF 0F 85 EB 00 00 00 57 E8 6B 46

а не

006CB4F3 66 81 7E 22 08 02 0F 85  EB 00 00 00 57 E8 6B 46

как в базе IDA

Last edited by zorin_chel (25-10-2015 12:27)

Offline

#248 26-10-2015 19:52

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

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

у меня получилось поменять в HEX редакторе + asi плагин вот что
https://youtu.be/K-7xkpbY_t0
пришлось в exe менять вот этот участок
https://yadi.sk/i/NZ7bFTcgk2kE7
как мне в запущенном процессе найти этот участок памяти, адрес

Last edited by zorin_chel (26-10-2015 20:04)

Offline

#249 27-10-2015 20:36

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

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

получилось вот что

#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>
#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;
}
 



DWORD WINAPI GtaSA_thread (LPVOID)
{
	 

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


	*var  -= 0x2c0000;
	*var2 -= 0x2c0000;
	*var3 -= 0x2c0000;
	*var4 -= 0x2c0000;
	*var5 -= 0x2c0000;
	*var6 -= 0x2c0000;
	

WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var3, var3, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var4, var4, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var5, var5, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var6, var6, sizeof(4), NULL);


     	
	{

		 for (;;Sleep (1000))           
		
	return 0;

	 
	}
	            

}

вопрос с шасси пока не решен
https://www.youtube.com/watch?v=NRbNcmd-e9s

Offline

#250 03-11-2015 17:08

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

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

есть адрес в процессе 0xBA18FC, значение в этом адресе = 0xAAA6480(динамический) - это опять же адрес, значение в котором, является адресом = 0x00C35E5C в этом адресе записана переменная, которую мне нужно сравнить, использую конструкцию:

   DWORD p1; 
    DWORD p2;
    DWORD p3;
 
    ReadProcessMemory(GtaSA_thread, (LPCVOID)(0xBA18FC), &p1, sizeof(4), NULL);//прочитали адрес 0xBA18FC, записали значение в p1
    p1 = p1 + 0x384; // прибавили смещение
    ReadProcessMemory(GtaSA_thread, (LPCVOID)p1, &p2, sizeof(4), NULL);//прочитали адрес р1(со смещением), записали значение в р2
    ReadProcessMemory(GtaSA_thread, (LPCVOID)p2, &p3, sizeof(4), NULL);//прочитали адрес р2, записали значение в р3
    if (p3 == 188)
    {
 
// если равно, то ...
    }

но не получается почему-то

Offline

Board footer

Powered by FluxBB