[PT] Seed - JuniorDjjr/VehFuncs GitHub Wiki
Destinado à programadores.
Seed
Cada veículo tem uma seed, que é um valor que determina como ele aparecerá — isto é, quais nodes serão selecionados durante o processamento dos Extras Recursivos, entre outros possíveis futuros usos.
Devido a cada vez que um veículo ser criado ele aparece com diferentes variações, é necessário que o programador tenha algum controle de como o veículo, que acabou de ser criado, deverá aparecer.
Por exemplo, você tem um carro contendo uma variação de extras: carro de pamonha. Como criar este carro com a variação de pamonha utilizando script? Eis a resposta:
Sanny Builder:
{$cleo}
const
pVehFuncs = 0@
pExt_GetCarSeed = 1@
pExt_SetCarSeed = 2@
hVehicle = 3@
pVehicle = 4@
x = 5@
y = 6@
z = 7@
iSeed = 8@
end
if 0AA2: pVehFuncs = load_library "VehFuncs.asi"
then
if and
0AA4: pExt_GetCarSeed = get_proc_address "Ext_GetCarSeed" library pVehFuncs
0AA4: pExt_SetCarSeed = get_proc_address "Ext_SetCarSeed" library pVehFuncs
then
0AA3: free_library pVehFuncs
else
0AA3: free_library pVehFuncs
0ACD: show_text_highpriority "~r~Fail to load 'VehFuncs.asi'. Update it." time 5000
0A93: end_custom_thread
end
else
0ACD: show_text_highpriority "~r~'VehFuncs.asi' was not found." time 5000
0A93: end_custom_thread
end
while true
wait 0
if 00DF: actor $PLAYER_ACTOR driving
then
if 0ADC: test_cheat "GET"
then
03C0: hVehicle = actor $PLAYER_ACTOR car
0A97: pVehicle = car hVehicle struct
0AA7: call_function pExt_GetCarSeed num_params 1 pop 1 pVehicle -> iSeed
0AD1: show_formatted_text_highpriority "Seed for this car is: %x" time 5000 iSeed
end
end
if 0ADC: test_cheat "NEW"
then
04C4: store_coords_to x y z from_actor $PLAYER_ACTOR with_offset 0.0 3.0 0.0
0247: load_model #ELEGY
038B: load_requested_models
car.Create(hVehicle, #ELEGY, x, y, z)
0A97: pVehicle = car hVehicle struct
0AA5: call pExt_SetCarSeed num_params 2 pop 2 iSeed pVehicle // Ext_SetCarSeed(CVehicle * vehicle, int seed)
end
end
GTA3script:
SCRIPT_START
{
LVAR_INT scplayer pVehFuncs pExt_GetCarSeed pExt_SetCarSeed hVehicle pVehicle iSeed
LVAR_FLOAT x y z
IF LOAD_DYNAMIC_LIBRARY VehFuncs.asi (pVehFuncs)
IF GET_DYNAMIC_LIBRARY_PROCEDURE "Ext_GetCarSeed" pVehFuncs (pExt_GetCarSeed)
AND GET_DYNAMIC_LIBRARY_PROCEDURE "Ext_SetCarSeed" pVehFuncs (pExt_SetCarSeed)
FREE_DYNAMIC_LIBRARY pVehFuncs
ELSE
FREE_DYNAMIC_LIBRARY pVehFuncs
PRINT_STRING_NOW "~r~Fail to load 'VehFuncs.asi'. Update it." 5000
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
ELSE
PRINT_STRING_NOW "~r~'VehFuncs.asi' was not found." 5000
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
GET_PLAYER_CHAR 0 scplayer
// https://forum.mixmods.com.br/f16-utilidades/t179-gta3script-while-true-return_true-e-return_false
WHILE TRUE
WAIT 0
IF IS_CHAR_SITTING_IN_ANY_CAR scplayer
IF TEST_CHEAT GET
STORE_CAR_CHAR_IS_IN_NO_SAVE scplayer (hVehicle)
GET_VEHICLE_POINTER hVehicle (pVehicle)
CALL_FUNCTION_RETURN pExt_GetCarSeed 1 1 (pVehicle)(iSeed) // Ext_GetCarSeed(CVehicle * vehicle)
PRINT_FORMATTED_NOW "Seed for this car is: %x" 5000 (iSeed)
ENDIF
ENDIF
IF TEST_CHEAT NEW
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS scplayer 0.0 3.0 0.0 (x y z)
REQUEST_MODEL ELEGY
LOAD_ALL_MODELS_NOW
CREATE_CAR ELEGY x y z (hVehicle)
GET_VEHICLE_POINTER hVehicle (pVehicle)
CALL_FUNCTION pExt_SetCarSeed 2 2 (iSeed pVehicle) // Ext_SetCarSeed(CVehicle * vehicle, int seed)
ENDIF
ENDWHILE
}
SCRIPT_END
É auto-explicativo.
extern "C" void __declspec(dllexport) Ext_SetCarSeed(CVehicle * vehicle, int seed)
extern "C" int32_t __declspec(dllexport) Ext_GetCarSeed(CVehicle * vehicle)
Tenha a nota de que você pode chamar a função Ext_SetCarSeed
para literalmente qualquer veículo, e quantos veículos quiser no mesmo frame, no entanto:
- Só chame logo após a criação do veículo (antes de qualquer renderização do carro ou processamento do jogo, como
WAIT
). - Não chame a função várias vezes para o mesmo veículo (por que você faria isto?) pois causará vazamento.
- Enviando
0
os extras não serão processados. Pode ser útil para testes e alguns casos.
Dica: Sempre que Ext_GetCarSeed
é chamado, o valor da seed é armazenado (em decimal) no VehFuncs.log
.
Caso dúvidas, você pode perguntar no Fórum MixMods.