Czy wiesz, że... rejestracja trwa tylko 20 sekund?
Strona główna forum Szukaj Rejestracja
Witaj, nieznajomy!
Postów: 37 Dołączył: 2012-12-25
#
a co chcesz wykonać w gta?? Też jestem zainteresowany tym tematem, ale nie wiem jak nadpisywać adresy pamięci. Natomiast wiem że .asi dają ogromne możliwości. Mam taki kod, może Ci się do czegoś przyda, aczkolwiek nie jest to mój kod

/////////////////////////////////////////////////////////////////////
//
// A better exception handler for GTA3 and GTA:Vice City
// By kyeman (and eAi) 9/13/2004.
//
// compile as .dll in msvc++6.0 and rename as .asi
// place in vc root
//
// 9/15/2004: (eAi) Added loads of features, mainly the new scm
// view that allows you to see a trace of the last scm
// functions called. Also now outputs to a file (in your
// game folder in a sub folder called "Crash Logs".
// Rewritten lots of things to work better with the new
// scm view. EFLAGS is now shown as binary.
// 9/14/2004: (eAi) Added GTA3 1.0 and 1.1 support. Changed some small
// things, such as the byte value for vc 1.0. Also added floats
// to output message, and "bad version" error message.
// Fixed: Double EDX output (meaning EFlags was lost)
// 9/14/2004: (me) Added 1.1 support, register display and scm thread.
//
/////////////////////////////////////////////////////////////////////

#include "resource.h"
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <direct.h>
#include "exceptions.h"

/////////////////////////////////////////////////////////////////////
// Using many globals to avoid stack alteration in naked hooks.

HANDLE hInstance =0;

// Addresses (defaulted to Vice 1.0)
DWORD opcodeint_hook_storage = 0x44FC3C;
DWORD opcodeint_proc_hook = 0x44FC1B;
DWORD opcodeint_ret_addr = 0x44FC21;

DWORD get_params_hook_storage = 0x44FD69;
DWORD get_params_ret_addr = 0x451017;
DWORD get_params_proc_hook = 0x451010;

DWORD exceptbox_hook_storage = 0x44FC6A;
DWORD exceptbox_proc_hook = 0x677E72;
DWORD exceptbox_ret_addr = 0x677EA9;

DWORD scm_parameters = 0x7D7438;
DWORD scm_script_base = 0x821280;

PDWORD pdwScmParams = (PDWORD)0x7D7438;

PGAME_SCRIPT_THREAD pLastScriptThread;
PCONTEXT pContextRecord;

DWORD dwSavedESP = 0;
DWORD dwSavedEBP = 0;
WORD _last_opcode = 0;
CHAR _opcode_info_string[BIG_STR_BUFFER];
DWORD _opcode_params = 0;

SCRIPT_LOG dwScriptLog[SCRIPT_LOG_SIZE] = { '' };
DWORD dwScriptLogPosition = 0;

BOOL boolIsVice = FALSE;
OPCODE_DEF odLoadedOpcodes[1500] = { '' };

/////////////////////////////////////////////////////////////////////

BOOL CALLBACK GuiDlgProcMain( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
DWORD i = 0;
CHAR sOpcodeInformation[255] = { '' };
CHAR _error_string[BIG_STR_BUFFER] = { '' };
CHAR _error_string_scm[HUGE_STR_BUFFER] = { '' };
CHAR sCurrentWorkingDirectory[255] = { '' };
CHAR sErrorLogPath[255] = { '' };
CHAR sOutputToFile[HUGE_STR_BUFFER] = { '' };
CHAR sBinaryOutput[31] = { '' };
CHAR game_version_string[25] = { '' };
CHAR dialog_caption[50] = { '' };

HFONT hFont = 0;
HMENU hSystemMenu = 0;
DWORD dwMenuItemCount = 0;
MENUITEMINFO miiNewMenu = { '' };

BYTE bNewValue = 1;

time_t tm;
struct tm *ltime;

FILE * fDebugLog;

switch( uMsg )
{
case WM_MOUSEMOVE:
ShowCursor(1);
break;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDC_OK_BUTTON:
EndDialog( hDlg, TRUE );
ExitProcess(0);
break;
case IDC_OK_DEBUG:
EndDialog( hDlg, TRUE );
break;
}
break;

case WM_SYSCOMMAND:
if(wParam == 1)
{
MessageBox(hDlg,"GTA Exception Handlern--------------------nCreated by Kyeman & eAinnFor more information see www.gtaforums.com","About",64);
return TRUE;
}
return FALSE;
break;
case WM_INITDIALOG:

OutputDebugString("-----------------------------------------------------------------------------");

GetOpcodeName(_last_opcode, sOpcodeInformation);

// cat address and SCM info.
sprintf(_error_string,"Exception at address:t0x%08XrnLast SCM executed:t%04X %srnIn thread:tt%srnrn",
pContextRecord->Eip,_last_opcode,sOpcodeInformation,pLastScriptThread->strName);

// cat register info
sprintf(_error_string+strlen(_error_string),
"Registers -----------------------------------------------------------------------------rn"
"EAX: 0x%08XtEBX: 0x%08XtECX: 0x%08XtEDX: 0x%08Xrn"
"ESI: 0x%08XtEDI: 0x%08XtEBP: 0x%08XtESP: 0x%08Xrn"
"EFLAGS: %srn",
pContextRecord->Eax,
pContextRecord->Ebx,
pContextRecord->Ecx,
pContextRecord->Edx,
pContextRecord->Esi,
pContextRecord->Edi,
pContextRecord->Ebp,
pContextRecord->Esp,
itoa(pContextRecord->EFlags, sBinaryOutput, 2)
);

SetDlgItemText(hDlg,IDC_ERROR_AREA, _error_string);

OutputDebugString(_error_string);
OutputDebugString("-----------------------------------------------------------------------------");

for(i = dwScriptLogPosition; i >= 1; i--)
{
if(dwScriptLog[i].dwScriptIP != 0)
{
OutputOpcodeFromSIP(&dwScriptLog[i], sOpcodeInformation);
sprintf(_error_string_scm+strlen(_error_string_scm),
"%srn", sOpcodeInformation);
}
}

for(i = SCRIPT_LOG_SIZE; i > dwScriptLogPosition; i--)
{
if(dwScriptLog[i].dwScriptIP != 0)
{
OutputOpcodeFromSIP(&dwScriptLog[i], sOpcodeInformation);
sprintf(_error_string_scm+strlen(_error_string_scm),
"%srn", sOpcodeInformation);
}
}

hFont = CreateFont(9, 0, 0, 0 ,0, FALSE, FALSE, 0, 0, 0, 0, 0, 0, "FixedSys");

SendMessage(GetDlgItem(hDlg,IDC_ERROR_AREA2),WM_SETFONT, (WPARAM)hFont, TRUE);

SetDlgItemText(hDlg,IDC_ERROR_AREA2, _error_string_scm);

// play a beep so that the user knows the error has happened
MessageBeep(MB_ICONASTERISK);

// now hide the window
if(boolIsVice == TRUE)
ShowWindow(FindWindow(NULL,"GTA: Vice City"), SW_MINIMIZE);
else
ShowWindow(FindWindow(NULL,"GTA3"), SW_MINIMIZE);

OutputDebugString(_error_string_scm);
OutputDebugString("-----------------------------------------------------------------------------");

// write it to a file
getcwd(sCurrentWorkingDirectory,255);
sprintf(sCurrentWorkingDirectory, "%s\%s", sCurrentWorkingDirectory, "Crash Logs");

if(chdir(sCurrentWorkingDirectory))
{
mkdir(sCurrentWorkingDirectory);
chdir(sCurrentWorkingDirectory);
}

time( &tm );

ltime = localtime( &tm );
ltime->tm_mon++;
ltime->tm_year += 1900;

memset(sOpcodeInformation, 0, strlen(sOpcodeInformation));
GetOpcodeName(_last_opcode, sOpcodeInformation);

sprintf(sErrorLogPath,"%s\log_%s_%02i_%02i_%04i-%02i_%02i_%02i.log",sCurrentWorkingDirectory, sOpcodeInformation, ltime->tm_mday, ltime->tm_mon, ltime->tm_year, ltime->tm_hour, ltime->tm_min, ltime->tm_sec);
fDebugLog = fopen(sErrorLogPath,"w");

switch(DetermineGTAVersion())
{
case VICE_10: strcpy(game_version_string,"Vice City 1.0"); break;
case VICE_11: strcpy(game_version_string,"Vice City 1.1"); break;
case GTA3_10: strcpy(game_version_string,"Grand Theft Auto 3 1.0"); break;
case GTA3_11: strcpy(game_version_string,"Grand Theft Auto 3 1.1"); break;
}

sprintf(dialog_caption, "GTA Exception Handler - %s", game_version_string);
SetWindowText(hDlg,dialog_caption);

sprintf(sOutputToFile, "%srn###################################################################################rnScm Output follows, top line was last line executed before the unhandled exception.rn###################################################################################rnrn%srnrn%s", _error_string, _error_string_scm, game_version_string);

if(fDebugLog)
{
fwrite(sOutputToFile,1,strlen(sOutputToFile),fDebugLog);
fclose(fDebugLog);
}
// add our About menu
hSystemMenu = GetSystemMenu(hDlg,FALSE);
dwMenuItemCount = GetMenuItemCount(hSystemMenu);
miiNewMenu.cbSize = sizeof(MENUITEMINFO);
miiNewMenu.fMask = MIIM_ID | MIIM_TYPE;
miiNewMenu.fType = MFT_SEPARATOR;
miiNewMenu.wID = 0;
InsertMenuItem(hSystemMenu,dwMenuItemCount,1, &miiNewMenu);

miiNewMenu.fState = MFS_ENABLED;
miiNewMenu.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
miiNewMenu.fType = MFT_STRING;
miiNewMenu.wID = 1;
miiNewMenu.dwTypeData = "&About";
miiNewMenu.cch = strlen("&About");

InsertMenuItem(hSystemMenu,dwMenuItemCount + 1,1, &miiNewMenu);

break;
case WM_CLOSE:
case WM_DESTROY:
EndDialog( hDlg, TRUE );
break;
}

return FALSE;
}

/////////////////////////////////////////////////////////////////////

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if(DLL_PROCESS_ATTACH==fdwReason)
{
hInstance = hinstDLL;
switch(DetermineGTAVersion())
{
case VICE_10:
boolIsVice = TRUE; // used for a hook
InstallOpcodeInterpreterHook();
InstallExceptionBoxHook();

break;
case VICE_11:
boolIsVice = TRUE; // used for a hook
exceptbox_proc_hook = 0x677EC2;
exceptbox_ret_addr = 0x677EF9;
pdwScmParams = (PDWORD)0x7D7440;

InstallOpcodeInterpreterHook();
InstallExceptionBoxHook();

break;
case GTA3_10:
opcodeint_proc_hook = 0x43953B;
opcodeint_hook_storage = 0x43955C;
opcodeint_ret_addr = 0x439541;

exceptbox_proc_hook = 0x5D8DF2;
exceptbox_ret_addr = 0x5D8E29;
exceptbox_hook_storage = 0x4395BA;

scm_parameters = 0x6ED460;
scm_script_base = 0x74B248;

pdwScmParams = (PDWORD)0x6ED460;

InstallOpcodeInterpreterHookGta3();
InstallExceptionBoxHookGta3();

break;
case GTA3_11:
opcodeint_proc_hook = 0x43953B;
opcodeint_hook_storage = 0x43955C;
opcodeint_ret_addr = 0x439541;

exceptbox_proc_hook = 0x5D90B2;
exceptbox_ret_addr = 0x05D90E9;
exceptbox_hook_storage = 0x4395BA;

scm_parameters = 0x6ED460;
scm_script_base = 0x74B248;

pdwScmParams = (PDWORD)0x6ED460;

InstallOpcodeInterpreterHookGta3();
InstallExceptionBoxHookGta3();

break;
case UNKNOWN_VERSION:
MessageBox(0,"Unknown GTA version, exception handler not installed", "Error", 0);
return FALSE;
break;
}

LoadOpcodes();
}

return TRUE;
}

/////////////////////////////////////////////////////////////////////
// From Spooky's code on gtaforums

int DetermineGTAVersion()
{
BYTE* VerCheck = (BYTE*)0x608578; // Byte at 0x608578 = 0x81 in VC 1.1, 0x5D in VC 1.0, 0x38 GTA3 1.1, 0x57 GTA3 1.0

switch (*VerCheck)
{
case 0x81: return VICE_11;
case 0x5D: return VICE_10; // I've changed this to 0x5D as thats what I see it as - was 0x5B (eAi)
case 0x38: return GTA3_11;
case 0x57: return GTA3_10;
}

return UNKNOWN_VERSION;
}

/////////////////////////////////////////////////////////////////////

VOID LoadOpcodes()
{
PCHAR equ_pos;
PCHAR comma_pos;

INT equ_array_pos=0;
CHAR opcode_string[10];
CHAR split_string[LITTLE_STR_BUFFER];
CHAR scm_name_string[LITTLE_STR_BUFFER];

UINT test_opcode=0;
UINT num_params;
UINT x=0;

FILE * fileScmIni;

CHAR line_buffer[BIG_STR_BUFFER];

float fScmParam = 0.0f;

if(DetermineGTAVersion() == VICE_11 || DetermineGTAVersion() == VICE_10)
{
fileScmIni = fopen("scm_vice.ini","r");
if(!fileScmIni)
{
MessageBox(0,"The required file 'scm_vice.ini' could not be found.","Error - File not found",0);
ExitProcess(0);
return;
}
}
else
{
fileScmIni = fopen("scm_gta3.ini","r");
if(!fileScmIni)
{
MessageBox(0,"The required file 'scm_gta3.ini' could not be found.","Error - File not found",0);
ExitProcess(0);
return;
}
}

while(!feof(fileScmIni))
{
fgets(line_buffer,LITTLE_STR_BUFFER,fileScmIni);
line_buffer[strlen(line_buffer)-1] = '';

if(NULL!=(equ_pos=strchr(line_buffer,'=')))
{

equ_array_pos = equ_pos - line_buffer;
memcpy(opcode_string, line_buffer, equ_array_pos);
opcode_string[equ_array_pos]='';

test_opcode = (UINT)strtoul(opcode_string,NULL,16);


strncpy(split_string,equ_pos+1,LITTLE_STR_BUFFER);

comma_pos=strchr(split_string,',');
if(!comma_pos) return;

*comma_pos = '';
strcpy(scm_name_string,comma_pos+1);

strcpy(odLoadedOpcodes[test_opcode].bName, scm_name_string);

num_params = atoi(split_string);

odLoadedOpcodes[test_opcode].dwParameterCount = num_params;
}
}
fclose(fileScmIni);
}

/////////////////////////////////////////////////////////////////////

BOOL GetOpcodeName(WORD dwOpcode, PCHAR ret_buffer)
{
if(strlen(odLoadedOpcodes[dwOpcode].bName))
{
strcpy(ret_buffer,odLoadedOpcodes[dwOpcode].bName);
return TRUE;
}
else
{
sprintf(ret_buffer,"unknown_%X", dwOpcode);
return FALSE;
}
}

/////////////////////////////////////////////////////////////////////

VOID OutputOpcodeFromSIP(PSCRIPT_LOG pScripLog, PCHAR ret_buffer)
{
// we minus two as this is the parameter pointer,
// not the opcode pointer (params are two bytes
// after the opcode start)
DWORD dwOpcodeOrigin = scm_script_base + pScripLog->dwScriptIP - 2;
WORD wOpcode = *(PWORD)dwOpcodeOrigin;
char wszOpcodeName[255] = { '' };
char wszOpcodeParams[255] = { '' };
char wszPadding[50] = { '' };
DWORD dwPaddingSize = 0;

GetOpcodeName(wOpcode,wszOpcodeName);
GetOpcodeParameters(pScripLog, odLoadedOpcodes[wOpcode].dwParameterCount, wszOpcodeParams);

dwPaddingSize = 30 - strlen(wszOpcodeName);
if(dwPaddingSize)
memset(wszPadding,32,dwPaddingSize);

if(!strcmp(wszOpcodeName,"jump") || !strcmp(wszOpcodeName,"jt") || !strcmp(wszOpcodeName,"jf") || !strcmp(wszOpcodeName,"gosub"))
sprintf(ret_buffer, "%s %s @%s", wszOpcodeName, wszPadding, wszOpcodeParams);
else
sprintf(ret_buffer, "%s %s %s", wszOpcodeName, wszPadding, wszOpcodeParams);
}

/////////////////////////////////////////////////////////////////////

VOID GetOpcodeParameters(PSCRIPT_LOG pScripLog, DWORD dwParamCount, PCHAR ret_buffer)
{
DWORD dwSIP = pScripLog->dwScriptIP;
BYTE bCurrentParameter = 0;
BYTE bParameterDataType = 0;
DWORD bCurrentParameterType = 0;
DWORD dwParameterAddress = dwSIP + scm_script_base;
DWORD dwVariableID = 0;

DWORD perm1,perm2;

VirtualProtect((LPVOID)dwParameterAddress,1000,PAGE_EXECUTE_READWRITE,&perm1);

while(bCurrentParameter < dwParamCount)
{
bCurrentParameter++;
bCurrentParameterType = *(BYTE *)dwParameterAddress;
dwParameterAddress += 1;
switch(bCurrentParameterType)
{
case DATA_TYPE_DWORD:

sprintf(ret_buffer+strlen(ret_buffer),"%d", *(DWORD *)dwParameterAddress);
dwParameterAddress += 4;
break;

case DATA_TYPE_VARIABLE:

/* HERE BE A PROBLEM
dwVariableID = (*(WORD *)dwParameterAddress - 12); // we ignore the first 12 bytes (if you set $var000c to 23, the script storage start + 0x18 = 23 (bit))
sprintf(ret_buffer+strlen(ret_buffer),"$var%04x = %d", dwVariableID, pScripLog->dwGlobalVariables[dwVariableID / sizeof(DWORD)]);
*/

sprintf(ret_buffer+strlen(ret_buffer),"$var%04X", *(WORD *)dwParameterAddress);
dwParameterAddress += 2;
break;

case DATA_TYPE_WORD:

sprintf(ret_buffer+strlen(ret_buffer),"%d", *(WORD *)dwParameterAddress);
dwParameterAddress += 2;
break;

case DATA_TYPE_BYTE:

sprintf(ret_buffer+strlen(ret_buffer),"%d", *(BYTE *)dwParameterAddress);
dwParameterAddress += 1;
break;

case DATA_TYPE_WORD_2:
sprintf(ret_buffer+strlen(ret_buffer),"%d", *(WORD *)dwParameterAddress);
dwParameterAddress += 2;
break;

case DATA_TYPE_FLOAT:
if(boolIsVice)
{
sprintf(ret_buffer+strlen(ret_buffer),"%.4f", *(float *)dwParameterAddress);
dwParameterAddress += 4;
}
else
{
sprintf(ret_buffer+strlen(ret_buffer),"%.4f", ((float)(*(short *)dwParameterAddress) / 16));
dwParameterAddress += 2;
}

break;

default:

dwParameterAddress -= 1; // strings start at the first byte
sprintf(ret_buffer+strlen(ret_buffer),""%s"", (CHAR *)dwParameterAddress);
dwParameterAddress += strlen((CHAR *)dwParameterAddress);
break;

}
sprintf(ret_buffer+strlen(ret_buffer),", ");
}

if(strlen(ret_buffer))
memset(ret_buffer+strlen(ret_buffer)-2,0,2);

dwParameterAddress = dwSIP + scm_script_base;

VirtualProtect((LPVOID)dwParameterAddress,1000,perm1,&perm2);

}

/////////////////////////////////////////////////////////////////////

void _declspec(naked) OpcodeInterpreterHook()
{
_asm mov pLastScriptThread, ecx
_asm and edx, 7FFFh
_asm mov _last_opcode, dx
_asm mov dwSavedESP, esp
_asm mov dwSavedEBP, ebp

_asm pushad

// save the last lot of scm parameters
memcpy(dwScriptLog[dwScriptLogPosition].dwParameters, &scm_parameters, sizeof(DWORD)*SCM_PARAM_COUNT);
memcpy(dwScriptLog[dwScriptLogPosition].dwGlobalVariables, &scm_script_base + 12, sizeof(DWORD)*SCM_GLOBALS_COUNT);

dwScriptLogPosition++;
dwScriptLog[dwScriptLogPosition].dwScriptIP = pLastScriptThread->dwScriptIP;
if(dwScriptLogPosition > SCRIPT_LOG_SIZE)
dwScriptLogPosition = 0;

_asm popad
_asm jmp opcodeint_ret_addr
}

/////////////////////////////////////////////////////////////////////

void _declspec(naked) ExceptionBoxHook()
{
_asm mov pContextRecord, esi
_asm pushad

DialogBox( hInstance, MAKEINTRESOURCE(IDD_EXCEPTION_DIALOG), NULL, (DLGPROC)GuiDlgProcMain );

_asm popad
_asm jmp exceptbox_ret_addr
}

/////////////////////////////////////////////////////////////////////

void InstallOpcodeInterpreterHook()
{
BYTE instructions[] = {OPCODEINT_HOOK_INSTRUCTIONCODE};

DWORD perm1,perm2;

VirtualProtect((LPVOID)opcodeint_hook_storage,sizeof(DWORD),PAGE_EXECUTE_READWRITE,&perm1);
*(PDWORD)opcodeint_hook_storage = (DWORD)OpcodeInterpreterHook;
VirtualProtect((LPVOID)opcodeint_hook_storage,sizeof(DWORD),perm1,&perm2);

VirtualProtect((LPVOID)opcodeint_proc_hook,sizeof(instructions),PAGE_EXECUTE_READWRITE,&perm1);
memcpy((PVOID)opcodeint_proc_hook,instructions,sizeof(instructions));
VirtualProtect((LPVOID)opcodeint_proc_hook,sizeof(instructions),perm1,&perm2);
}

/////////////////////////////////////////////////////////////////////

void InstallOpcodeInterpreterHookGta3()
{
BYTE instructions[] = {GTA3_OPCODEINT_HOOK_INSTRUCTIONCODE};

DWORD perm1,perm2;

VirtualProtect((LPVOID)opcodeint_hook_storage,sizeof(DWORD),PAGE_EXECUTE_READWRITE,&perm1);
*(PDWORD)opcodeint_hook_storage = (DWORD)OpcodeInterpreterHook;
VirtualProtect((LPVOID)opcodeint_hook_storage,sizeof(DWORD),perm1,&perm2);

VirtualProtect((LPVOID)opcodeint_proc_hook,sizeof(instructions),PAGE_EXECUTE_READWRITE,&perm1);
memcpy((PVOID)opcodeint_proc_hook,instructions,sizeof(instructions));
VirtualProtect((LPVOID)opcodeint_proc_hook,sizeof(instructions),perm1,&perm2);
}

/////////////////////////////////////////////////////////////////////

void InstallExceptionBoxHook()
{
BYTE instructions[] = {EXCEPTBOX_HOOK_INSTRUCTIONCODE};

DWORD perm1,perm2;

VirtualProtect((LPVOID)exceptbox_hook_storage,sizeof(DWORD),PAGE_EXECUTE_READWRITE,&perm1);
*(PDWORD)exceptbox_hook_storage = (DWORD)ExceptionBoxHook;
VirtualProtect((LPVOID)exceptbox_hook_storage,sizeof(DWORD),perm1,&perm2);

VirtualProtect((LPVOID)exceptbox_proc_hook,sizeof(instructions),PAGE_EXECUTE_READWRITE,&perm1);
memcpy((PVOID)exceptbox_proc_hook,instructions,sizeof(instructions));
VirtualProtect((LPVOID)exceptbox_proc_hook,sizeof(instructions),perm1,&perm2);
}

/////////////////////////////////////////////////////////////////////

void InstallExceptionBoxHookGta3()
{
BYTE instructions[] = {GTA3_EXCEPTBOX_HOOK_INSTRUCTIONCODE};

DWORD perm1,perm2;

VirtualProtect((LPVOID)exceptbox_hook_storage,sizeof(DWORD),PAGE_EXECUTE_READWRITE,&perm1);
*(PDWORD)exceptbox_hook_storage = (DWORD)ExceptionBoxHook;
VirtualProtect((LPVOID)exceptbox_hook_storage,sizeof(DWORD),perm1,&perm2);

VirtualProtect((LPVOID)exceptbox_proc_hook,sizeof(instructions),PAGE_EXECUTE_READWRITE,&perm1);
memcpy((PVOID)exceptbox_proc_hook,instructions,sizeof(instructions));
VirtualProtect((LPVOID)exceptbox_proc_hook,sizeof(instructions),perm1,&perm2);
}

/////////////////////////////////////////////////////////////////////

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
w vc trzeba jeszcze dodać w thread 'MAIN'
create_thread_wb @teleport
aby odczytało ten skrypt. Dotyczy scm.

i mam pytanie czym się różni
create_thread od create_thread_wb?

kiedyś znalazłem taki kod na teleportacje w VC

Kod:
:testowyKod
0001: wait  0 ms   
00D6: if  
00F8:   player $PLAYER_CHAR stopped  1 (in-sphere)near_point 737.381 -867.615 21.8 radius  0.75  0.75  1.0
004D: jump_if_false @testowyKod
83EE:   NOT   player $PLAYER_CHAR controllable
016A: fade  0 (black)  500 ms       
0001: wait  500 ms
jump 
@kodTele

:kodTele
0055: put player $PLAYER_CHAR at 737.381 -868.615 21.8   
016A: fade  1 (white)  500 ms 
0001: wait  500 ms       
03EE:   player $PLAYER_CHAR controllable
02EB: restore camera with jumpcut
004E: end thread


Mam jeszcze jedno pytanie dotyczące większej ilości teleportów czy przy każdym znaczniku muszę dodawać nowy create_thread_wb?

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Może chodzi zamiast create_pickup #INFO type 3
create_pickup #BODYARMOUR czy jakoś tak, najlepiej wyszukaj pickup z sa skopiuj i zmień koordynaty
w wyszukiwarce wpisz BODYARMOUR i powinno coś znaleźć
innych nie ma co zmieniać

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Może zmniejsz liczbę obiektów do 4, jak będzie działać to zwiększ limit adjusterem żeby działało co najmniej 7 nowych obiektów. Można też od razu zwiększyć limit bez zmniejszenia liczby obiektów do 4

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Właśnie Shadow Mesh w VC nie działa próbowałem, o ile wiem to tworzy się je w ten sposób

Klikamy na Get from Collision Mesh
http://www.gtabigday.comxa.com/img/gtasacienie1

i jeśli się pojawi ikonka cienia(mniejsza strzałka) to cień jest dodany, po kliknięciu w ikonkę na miejscu drzewka powinien się pojawić ten sam model
http://www.gtabigday.comxa.com/img/gtasacienie2

Cienie latarni, sygnalizacji świetlnej przesuwają się gdy przemieszcza się słońce i ten cień jest nawet jak jako coll użyje jakiegoś budynku




___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Już od dawna chciałem napisać, czy zna ktoś sposób na utworzenie cieni w gta VC? Docelowo cienie dynamiczne? Takie które rzucają cień względem przemieszczania się słońca. Metoda może być dowolna chodzi o to aby cienie rzucane były przez budynki, lub chociaż aby model był ciemniejszy w miejscach gdzie powinno być ciemniej. Wiem że można tworzenie cieni alpha
http://www.gtabigday.comxa.com/img/cien aczkolwiek to nie jest do końca satysfakcjonujące:
- cień po obróceniu kamery znika (głównie z tego powodu)
- cień względem czasu jest w miejscu
- jest bez względu czy świeci słońce czy pada deszcz

Obecnie tak jest miejscach gdzie powinno być ciemniej(pod wiaduktami, mostami itd). Ktoś ma jakieś pomysły??
http://www.gtabigday.comxa.com/img/cien1


___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Tekstury mogą być zbyt wyraziste i będą widoczne z bliska bardzo szczegółowo a z daleka gorzej, tekstury lod powinny być lekko rozmazane(blur)

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Poradnik dobry, tylko że chodzi właśnie na wersjach podobnież od 8, ja mam maxa 7 :p

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
a czy w cleo da rade edytować plik handling.cfg podczas gry? Kiedyś widziałem mod w którym można edytować pogode plik timecyc.dat w trakcie gry, stworzył chyba nawet polak

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
A co myślicie o dodaniu liczniku wyświetleń w artykułach na stronie? Byłoby wiadomo jakie artykuły są najpopularniejsze i ile jest odsłon.

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Na przejścia są na pewno różne sposoby, ja na teksturę ulicy nakładam teksture dirt64.bmp, następnie teksture trawy :P oteksturować da się zarówno w maxie jak i w zmodzie. Z modeli LOD można(lecz nie trzeba) pousuwać wnęki w oknach jeśli model jest szczegółowy, schodki przerobić na plane(podjazd) i takie tam szczegóły.

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Sabaru! Super wykonanie ;D ta droga w poprzek mogłaby przechodzić pod tymi i biec dłuugo do innych miast. Zdjęcia można czasami obrócić jeśli jest łatwiej, kształt dróg można zmieniać. Poniżej model ulicy, możesz się na nim wzorować(szerokości pasów, pobocza) np. w środku okręgu ulic można umieścić inne drogi.
droga

http://gtabigday.comxa.com/img/gta12612
http://gtabigday.comxa.com/img/trasa1
http://gtabigday.comxa.com/img/trasa2


___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Przejrzyjcie tamten poradnik co podałem, modele dff były robione aby były jak najlżejsze(nie za duże) jeśli ulica ma 1000m to można ją podzielić na 5 razy, czy nawet więcej. Jeśli obiekt jest za duży przy dojeżdżaniu będzie widać model LOD nawet gdy będziemy przy modelu- zniknie gdy będziemy bliżej wartości x,y,z. Jeśli nie będzie modelu LOD, obiekt się pojawi dopiero po dojechaniu jak najbliżej wartości ustawienia modelu w map edytorze.
Budynki trzeba dopasować do gracza, najlepiej na początku modelować budynek przy ulicy- będzie skala. Skale można sprawdzać podczas wgrywania modelu do gry i sprawdzania czy dana szerokość odpowiada. Można też zaimportować model porównawczy(postać, samochód) do programu i według niego modelować. Na ulice z chodnikiem można obrać szerokość 20m, należy pamiętać że szerokość ulic się zmienia gdy są pobocza, jest więcej pasów itp. Powyższe zachowania LOD dotyczą gta Vice City :p
Tutaj na forum też są dobre poradniki na temat ulic.

Dodałem wiadukty trochę było z tym roboty
http://gtabigday.comxa.com/img/gta2
http://gtabigday.comxa.com/img/gta3

edit. Kilka screenów, wnętrze budynku
główna sala
http://www.gtabigday.comxa.com/img/wejscie
wejścia na piętra
http://www.gtabigday.comxa.com/img/wnetrze

wieżowiec:
http://www.gtabigday.comxa.com/img/wiezowiec1
http://www.gtabigday.comxa.com/img/wiezowiec2

edit.
Dodane są wieżowce - aczkolwiek jeszcze kilka trzeba dodać.
http://gtabigday.comxa.com/img/wiezowce12
http://gtabigday.comxa.com/img/wiezowce13
więcej z postępów prac w tym temacie - link do warsztatu Big Day
Jeśli ktoś chętny do tworzenia budynków, pisać.

Gra będzie się zaczynać informacjami które wprowadzą nas po trochu w mod, oraz będzie bardziej rozbudowany scm, jeśli ktoś chętny do pomocy lub ma pomysły - pisać.
http://gtabigday.comxa.com/img/gta-bd1

niektóre pojazdy mogą być ustawione przy ulicy tak jak tu:

- zaparkowane pojazdy


___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
Nie będę się za dużo rozpisywał, to jest artykuł z którego ja kiedyś się uczyłem modelować zakręty w maxie

link do gtaforums

są podane też średnie proporcje jakie może mieć droga, skrzyżowania trzeba robić samemu ale szybką idą:p skala ulic musi pasować do otoczenia, być może budynki są za dużej skali.
Chodnik może być mniejszy i wynosić 4 a ulica 12.

___________________
GTA Big Day - największy polski mod do Vice City
Postów: 37 Dołączył: 2012-12-25
#
zaratustra- nie które budynki są bardziej szczegółowe np ten[IMG=http://img832.imageshack.us/img832/7749/gtaod.jpg][/IMG] ta ulica będzie cała szczegółowych budynków, mod był robiony na wzór VC czyli modele nie są zbyt szczegółowe.
Ostatnio modelowałem drogę "ekspresową" tzn. przerabiałem istniejącą bo była kanciata i krótka. 2 dni teksturowania w zmodelerze ale efekt bezcenny:P

tak było(zakręt był ciasny):
http://img689.imageshack.us/img689/8779/gtabd1559984

a jest tak:
http://img11.imageshack.us/img11/3294/gtabd11

http://img217.imageshack.us/img217/3148/gtabd12


http://img842.imageshack.us/img842/4714/nowaulica

nad drogą będą wiadukty :D

___________________
GTA Big Day - największy polski mod do Vice City
Created & Powered by MakG