[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:

  1. Só chame logo após a criação do veículo (antes de qualquer renderização do carro ou processamento do jogo, como WAIT).
  2. Não chame a função várias vezes para o mesmo veículo (por que você faria isto?) pois causará vazamento.
  3. 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.