#1 13-03-2011 13:19

Sergey81
Registered: 19-12-2008
Posts: 654

Seemann's MP3 Player for GTA 3 and VC

Я немного переделал исходники, чтоб плеер работал в GTA 3 и VC. В текущей версии всё работает точно так же, как и в SA, а также добавлена возможность моментально завершить игру нажатием кнопки End.
Установка проста - radio.asi кидаем в корневую директорию игры, radio.ini в папку CLEO.
По умолчанию кнопки управления в radio.ini настроены так:

[keys]
key_on=123 //F12 - включить/выключить
key_prev=120 //F9 - предыдущий трек в списке
key_next=121 //F10 - следующий трек в списке
key_pause=119  //F8 - пауза
key_shuffle=122  //F11 - режим перемешивания (треки будут играть в случайном порядке)
key_end=35       //END - завершение процесса игры

[playlist]
C:\Users\13\Music\OST Midnight Club L.A\Electronic\Midnight Madness.mp3
C:\Users\13\Music\GTA4 TBoGT OST\Vice City FM

В разделе [playlist] указываются имена треков или папок с mp3.

Версия для Vice City:
af65e75aa20c44d87c7c7909b5b91644.jpeg  48558b21aa176d6a57f46c8afd72514d.jpeg 

Видео - http://www.youtube.com/watch?v=K9rulG_AeSY

Скачать - http://www.sendspace.com/file/7mwd3j

Версия для GTA 3:
caab59dcd00e85414352ebc90fc126c3.jpeg  ccb12c1af54c1c049e6fb3f041ffe311.jpeg 

Скачать - http://www.sendspace.com/file/nonvcp

Last edited by Sergey81 (14-03-2011 18:58)

Offline

#2 13-03-2011 18:13

Alien
Registered: 12-10-2008
Posts: 564

Re: Seemann's MP3 Player for GTA 3 and VC

Сообщения сделать в принципе можно, я даже нашёл необходимые адреса, но функция ShowTextBox в SA отличается от аналогичной функции VC, я так и не разобрался как её правильно переделать в Delphi(может посмотрит кто?).

Я не смотрел, но скорее всего ты используешь тип PAnsiChar для передачи строки. Попробуй PWideChar (ну или какой там тип для юникода  - я уже не помню). В Delphi, вообще говоря, принято использовать просто тип PChar или String, но в последних версиях Delphi этим типам соответствуют юникодные реализации, а в любимом многими Delphi 7 - ANSI реализации. Когда требуется делать какие-то низкоуровневые операции, на эти различия нужно обращать внимание.

Last edited by Alien (13-03-2011 18:14)

Offline

#3 13-03-2011 18:29

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Seemann's MP3 Player for GTA 3 and VC

@Alien - Там загвоздка, насколько я могу судить, даже не в этом.
SanApi.pas:

unit SanApi;

interface uses Windows;

function KeyPressed(const Key: Smallint): Boolean; stdcall;
var ShowTextBox: procedure(Text: PChar; Flag1, Infinite, Flag3: Byte); cdecl;
procedure RemoveTextBox;


implementation

procedure RemoveTextBox;
begin
  ShowTextBox(Nil, 1, 0, 0);
end;

function KeyPressed(const Key: Smallint): Boolean; stdcall;
begin
  Result := Hi(GetKeyState(Key))=$FF;
end;


begin

  if PLongInt(Ptr($008A6168))^ = $465E60 then
  begin
    @ShowTextBox := Ptr($00588BE0);

  end else begin
    @ShowTextBox := Ptr($005893B0);

  end;
end.

Для VC соответственно меняю адреса:

  if PLongInt(Ptr($00XXXXXX))^ = $XXXXXX then
  begin
    @ShowTextBox := Ptr($0055BFC0);

  end else begin
    @ShowTextBox := Ptr($0055BFE0);

  end;

Вместо XXXXXX можно тот же 55BFC0 подставить, но не суть важно.
В SA функция ShowTextBox вот такая:

.text:00588BE0     _?ShowTextBox   proc near               ; CODE XREF: _checkCheatcode+D3p
.text:00588BE0                                             ; sub_43DC10+8p
.text:00588BE0                                             ; sub_43DC60+23p
.text:00588BE0                                             ; CGameLogic__update+EBp ...
.text:00588BE0
.text:00588BE0     arg_0           = dword ptr  4
.text:00588BE0     arg_4           = byte ptr  8
.text:00588BE0     arg_8           = byte ptr  0Ch
.text:00588BE0     arg_C           = byte ptr  10h
.text:00588BE0
...
.text:00588D3C 000                 retn
.text:00588D3C     _?ShowTextBox   endp

В VC же, такая:

.text:0055BFC0     ; void __cdecl TextBox(wchar_t *, char, int permanent)
.text:0055BFC0     TextBox         proc near               ; CODE XREF: sub_430A60+12B6p
.text:0055BFC0                                             ; sub_430A60+2E20p
.text:0055BFC0                                             ; CPickup__Process+AFCp
.text:0055BFC0                                             ; CPickup__Process+14DEp ...
.text:0055BFC0
.text:0055BFC0     text            = dword ptr  4
.text:0055BFC0     arg_4           = byte ptr  8
.text:0055BFC0     permanent       = dword ptr  0Ch
.text:0055BFC0
.text:0055BFC0 000                 cmp     ds:replayStage, 1
...
.text:0055C1EE 000                 retn
.text:0055C1EE     TextBox         endp

Нужно видоизменить var ShowTextBox в третьей строке и потом все её вызовы, я правильно понимаю?

Last edited by Sergey81 (13-03-2011 22:18)

Offline

#4 13-03-2011 20:10

Alien
Registered: 12-10-2008
Posts: 564

Re: Seemann's MP3 Player for GTA 3 and VC

О чем я и говорю, в VC используются игровые тексты с шириной символа 2 байта, а в SA - 1 байт. Для SA такое объявление:

ShowTextBox: procedure(Text: PAnsiChar; Flag1, Infinite, Flag3: Byte); cdecl;

Для VC такое:

ShowTextBox: procedure(Text: PWideChar; Flag1, Infinite: Byte); cdecl;

Никогда не знал хорошо Delphi, но, погуглив, накопал такой код вызова:

ShowTextBox(PWideChar(WideString('string')), 0, 0)

PS: кажется, mp3-плеер, использовавшийся Seemann'ом несколько баженный.

Offline

#5 14-03-2011 12:59

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Seemann's MP3 Player for GTA 3 and VC

@Alien - Ага, спасибо, всё получилось:
Доделаю поддержку гта 3 и разных версий экзешников, выложу с исходником.

PS: кажется, mp3-плеер, использовавшийся Seemann'ом несколько баженный.

Ну конечно не идеал, например фризы при загрузке трека, иногда бывают вылеты при переключении треков, но, учитывая что под 3 и вайс мп3 плееров насколько я знаю нет вобще, вполне сойдёт.
Я даже потестил ещё с десяток миссий на предмет ошибок IV hud под Vice City FM smile

UPD. Всё доделал, выложил и обновил первый пост.

Offline

#6 15-03-2011 16:27

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: Seemann's MP3 Player for GTA 3 and VC

Кхе-кхе, начал я с того, что кинул в трёшку вайсовские файлы, но всё равно плеер завопил так, что кинулся выключать колонки (игра зависла, она вобще так делала, когда плееру "в песнях не везло") и вспомнил, почему его в Сане не использую - а можно использовать не системные настройки громкости, а игры, например?
Вобщем, ярлыки не умеет подхватывать, дал папку, как начинал одну и ту же песню орать, игра зависала... Думал, может много файлов (109) или папок (~6), выкинул папки, начинает на тот же песне и...
Ладно, из плейлиста выдернул около 20 песен, в ини файл вставил, стал прокручивать, на песне (музыка вся на другом разделе того же жёсткого) с русским названием зависло, но только игра, а не музыка! (кнопка END хорошо иногда всё-таки срабатывала!), выкинул из *.ini эту строчку, на
F:\Music\1_Sborka\Tiesto_vsMaxi_jazz-dance4life.mp3
снова, Вайс не смотрел, поздно уже было...

Offline

#7 20-03-2011 23:13

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Seemann's MP3 Player for GTA 3 and VC

Странно, версия для GTA 3 внезапно стала вешать игру при нажатии F12. Хотя раньше работала. Зависание явно вызвано функцией показа текст бокса, но что ей опять не нравится я пока не разобрался.

Offline

#8 06-07-2011 07:11

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: Seemann's MP3 Player for GTA 3 and VC

Странно, версия для GTA 3 внезапно стала вешать игру при нажатии F12. Хотя раньше работала. Зависание явно вызвано функцией показа текст бокса, но что ей опять не нравится я пока не разобрался.

А где у тебя функции обрабатываются в таймере?

Offline

Board footer

Powered by FluxBB