You are not logged in.
Нет, под группой я не pedtype имел ввиду, а когда несколько гангстеров вместе идут.
Как определить, к какой группе принадлежит актёр?
0AE1 хранит последеного найденного актера либо в стурктуре CCustomThread, либо в статической переменной (если это CScriptThread).
static int gLastIdx = 0; CCustomThread *asCustom = this->AsCustom(); int *lastIdx = asCustom ? &asCustom->lastFoundActor : &gLastIdx;
Во-первых, я C++ не знаю, только Delphi.
Во-вторых, мне это из скрипта нужно сделать.
@Alien, не подскажешь, где в памяти опкод 0AE1 хранит последнего найденного актёра?
Спасибо, GTASA!
Как получить хэндл того, кто бьёт или среляет в актёра?
Я плагины для ГТАшки не создаю, но на пару вопросов всё-же ответить могу:
1) Угадал. 
2) Переименовать и ничего более.
В справке CLEO 4 есть тема создания своих опкодов.
Вот маленький и простенький плагин реального времени в игре. Исходник прилагается. Может что-нибудь интересное там найдёшь.
[You must login to view hidden text.]
Есть. GXT Hook называется.
@~AquaZ~
[You must login to view hidden text.]
Для подобных вещей настоятельно рекомендуется использовать тэг hide
(а лучше пользоваться PM)
@~AquaZ~
Насчёт "сплющенных текстур", вот держи. Надеюсь, как это дело работает, сам разберёшся.
{$CLEO .cs}
0000:
0390: load_txd_dictionary 'ImgTest'
038F: load_texture "Img1" as 60
0A8D: 3@ = read_memory 12677188 size 4 virtual_protect 0 // Ширина экрана в пикселях
0A8D: 4@ = read_memory 12677192 size 4 virtual_protect 0 // и его высота
0093: 3@ = integer 3@ to_float
0093: 4@ = integer 4@ to_float
0073: 3@ /= 4@
4@ = 120.0 // Сюда пишем высоту текстуры
006B: 4@ *= 3@
4@ *= 0.7
:label
wait 0
03F0: enable_text_draw 0
03E3: set_texture_to_be_drawn_antialiased 1
074B: draw_texture 60 position 320.0 150.0 scale 120.0 4@ angle 0.0 color_RGBA 255 255 255 255
jump @label
@Aquaz Текстуру в TXD вверх тормашками запихни, а angle на нуль поставь.
Второй способ - высоту текстуры отрицательной сделать.
1. Максимальная скорость...
00AD: set_car 22@ max_speed_to 10.0
С машиной игрока не работает. 
Как изменить максимальную скорость и ускорение машины игрока?
Sanchez, спасибо тебе большое!
Кстати, твой исходник намного компактней моего получился.
Прога должна писать данные в память потока по заданному смещению, а вместо этого выдаёт "Access violation at address...". Что тут не так?
procedure TForm1.Button2Click(Sender: TObject);
var
PID: LongInt;
MAddr: LongInt;
const
Offset = 1578;
begin
PID := GetPID('gta_sa.exe');
if PID = 0 then
MessageBox(handle,pchar('Игра не запущена.'),pchar('Ошибка!'),16)
else
begin
MAddr := ReadMemoryInt($A8B42C, PID);
While MAddr <> 0 do
if ReadMemoryString(MAddr + 8, PID) = 'CRSPEED' then
begin
MAddr := ReadMemoryInt(MAddr + 16, PID);
inc(MAddr, Offset);
WriteMemoryByte(MAddr, 255, PID);
Exit;
end;
MAddr := ReadMemoryInt(MAddr, PID);
end;
MessageBox(handle,pchar('Поток CRSPEED не найден.'),pchar('Ошибка!'),16);
end;
end;
function GetPID(name: string): LongInt;
var
hSnapshot: THandle;
lppe: TProcessEntry32;
begin
Result := 0;
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if hSnapshot = 0 then
exit;
lppe.dwSize := SizeOf(TProcessEntry32);
if Process32First(hSnapshot,lppe) then
repeat
if name = ExtractFileName(lppe.szExeFile) then
begin
Result := lppe.th32ProcessID;
break;
end;
until not Process32Next(hSnapshot,lppe);
CloseHandle(hSnapshot);
end;
function ReadMemoryInt(MainAddress, IDAgent: LongInt): LongInt;
var HandleWindow : LongInt;
ipBase: Pointer;
IpBuf: LongInt;
numberRead: DWORD;
begin
HandleWindow:=OpenProcess(PROCESS_VM_READ,False,IDAgent);
ipBase:=ptr(MainAddress);
ReadProcessMemory(HandleWindow, ipBase, Addr(ipbuf), 4, numberRead);
CloseHandle(HandleWindow);
Result := ipbuf;
end;
function ReadMemoryString(MainAddress, IDAgent: LongInt): PChar;
var HandleWindow : LongInt;
ipBase: Pointer;
IpBuf: PChar;
numberRead: DWORD;
begin
HandleWindow:=OpenProcess(PROCESS_VM_READ,False,IDAgent);
ipBase:=ptr(MainAddress);
ReadProcessMemory(HandleWindow, ipBase, Addr(ipbuf), 8, numberRead);
CloseHandle(HandleWindow);
Result := ipbuf;
end;
procedure WriteMemoryByte(MainAddress: LongInt; ipBuf: Byte ;IDAgent: LongInt);
var HandleWindow : LongInt;
ipBase: Pointer;
numberWrite: DWORD;
begin
HandleWindow:=OpenProcess(PROCESS_ALL_ACCESS,False,IDAgent);
ipBase:=ptr(MainAddress);
WriteProcessMemory(HandleWindow, ipBase, Addr(ipbuf), ipBuf, numberWrite);
CloseHandle(HandleWindow);
end;
Теперь всё понятно.
Скрипт:
{$CLEO .cs}
wait 6000
0AF4: 1@v = read_string_from_ini_file "cleo\Config.ini" section "General" key "Param1"
0AF4: 2@v = read_string_from_ini_file "cleo\Config.ini" section "General" key "Param2"
0ACC: show_text_lowpriority 1@v time 3000
wait 2000
0ACC: show_text_lowpriority 2@v time 3000
0A93: end_custom_threadINI-файл, который мы читаем:
[General] Param1=True Param2=False
Затем всё внимание на экран...
Выводит первую переменную - TrueFalse (???).
Затем вторую - False (вроде правильно).
Это можно исправить?
Нет, это мне не подходит. Мне КОНКРЕТНЫЙ адрес нужен.
Кто-нибудь, подскажите какой-либо статический адрес, который игра никогда не использует и он доступен для чтения/записи из скрипта.
@CraZZZy-GameRRR - попытаться можно, но смысл-то в чем? Лень упаковывать текстуры в архивы?
Ну, например, любой желающий сможет нарисовать и с лёгкостью подключить свой собственный скин к моему спидометру. К тому же текстуры в PNG весят намного меньше нежели в TXD (у меня 240 КБ против 2.27 МБ). Можно ещё кучу других пременений придумать.
@Alien - Спасибо, теперь работает правильно!
Alien, ести не трудно, можешь в CLEO добавить опкод типа 038F для загрузки текстур из PNG файлов?
CraZZZy-GameRRR wrote:Seemann wrote:Это CLEO скрипты, или ты в main.scm их создаешь?
CLEO
Тогда внимательно перечитай правила создания CLEO скриптов и подумай, глюк это или фича
http://cleo.sannybuilder.com/?lang=ru&id=3
Ага... теперь понял. Ура! заработало... Спасибки! 
Похоже, я баг нашёл в CLEO 4.
Вот мой скрипт нормального ручного тормоза:
0000: NOP
:Brake_1
wait 0
if
Actor.Driving($PLAYER_ACTOR)
jf @Brake_1
03C0: 0@ = actor $PLAYER_ACTOR car
2@ = 0
:Brake_2
wait 0
if
Actor.Driving($PLAYER_ACTOR)
jf @Brake_10
01BD: 1@ = current_time_in_ms
0062: 1@ -= 3@
IF
1@ >= 350
jf @Brake_3
IF
0AB0: key_pressed 0x42
THEN
IF
2@ == 1
THEN
2@ = 0
ELSE
2@ = 1
END
01BD: 3@ = current_time_in_ms
END
:Brake_3
IF
2@ == 1
THEN
0A8C: write_memory 0xB73464 size 1 value 255 virtual_protect 0
END
jump @Brake_2
:Brake_10
Car.RemoveReferences(0@)
jump @Brake_1Жмём <B> - машина стоит, ещё раз жмём - не стоит.
А этот скрипт определяет состояние ручника:
0000: NOP :BrakeTest wait 0 if Actor.Driving($PLAYER_ACTOR) jf @BrakeTest 0A8D: 1@ = read_memory 0xB73464 size 1 virtual_protect 0 01E4: show_text_1number_lowpriority GXT 'NUMBER' number 1@ time 0 flag 1 jump @BrakeTest
Проблема в том, что в CLEO 4 (v 4.1.0.25) если использовать мой ручник, скрипт проверки всегда выдаёт 0 (ручник опущен), а если обычный (пробел) - определяет правильно. В CLEO 3 (v 3.0.950) работает без проблем.
Это CLEO скрипты, или ты в main.scm их создаешь?
CLEO
Ещё раз спасибо!