020A

From GTAMods Wiki
Revision as of 23:36, 20 January 2017 by Spaceeinstein (talk | contribs) (example and disassembly)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

GTA III Vice City San Andreas LOCK_CAR_DOORS


Description
Sets the door lock status of the vehicle
Syntax
020A: set_car [car handle] door_status_to [int]
Parameter
[car handle]
The handle of the vehicle
[int]
Car lock (see below)
Native analog
LOCK_CAR_DOORS

This opcode sets the door status of the vehicle. Of course, the opcode only affects vehicles with a working door. In GTA III, this opcode behaves exactly as opcode 0135.

Car locks

Car lock Enum Description
0 CARLOCK_NONE
1 CARLOCK_UNLOCKED unlocked car
2 CARLOCK_LOCKED locked car – properties include doors can't fall off, no one can enter but can exit, anyone can enter if door left wide open or fallen off
3 CARLOCK_LOCKOUT_PLAYER_ONLY locked for the player, not locked for NPCs
4 CARLOCK_LOCKED_PLAYER_INSIDE locked, the player is stuck in the car
5 CARLOCK_LOCKED_INITIALLY locked when not in car, unlocks when in car
6 CARLOCK_FORCE_SHUT_DOORS animation will never leave door opened, always closes door
7 CARLOCK_LOCKED_BUT_CAN_BE_DAMAGED locked but doors can fall off

Example

The following example allows the vehicle you are in to be locked when holding button 6 (HANDBRAKE key) and unlocked when not holding it.

// set constants
const
PLAYER_CAR = 0@
end

while true
    wait 10
    if
        0256:   player $PLAYER_CHAR defined
    then
        if
            00DF:   actor $PLAYER_ACTOR in_any_car
        then
            03C0: PLAYER_CAR = actor $PLAYER_ACTOR car_no_save
            if
                00E1:   key_pressed 0 6  // handbrake key
            then
                020A: set_car PLAYER_CAR door_status_to 2  // CARLOCK_LOCKED
            else
                020A: set_car PLAYER_CAR door_status_to 1  // CARLOCK_UNLOCKED
            end
        end
    end
end

Disassembled code

These are disassembled code for this opcode both from PC v1.0 US.

GTA III

loc_442DAC:
    lea     eax, [ebp+10h]                    ; get address of script's current instruction pointer
    mov     ecx, ebp                          ; get address of script for thiscall
    push    2                                 ; push 2 for two parameters to collect
    push    eax                               ; push address of script's current instruction pointer
    call    CRunningScript::CollectParameters ; call CRunningScript::CollectParameters(uint *,short)
    mov     eax, ds:ScriptParams[0]           ; get value of first parameter, the vehicle handle
    mov     ecx, ds:CPools::ms_pVehiclePool   ; get address of vehicle pool for thiscall
    push    eax                               ; push vehicle handle
    call    CPool_CVehicle_CAutomobile::GetAt ; call CPool<CVehicle, CAutomobile>::GetAt(int) to get address of vehicle
    mov     ecx, ds:ScriptParams[1]           ; get value of second parameter, the car lock
    mov     [eax+224h], ecx                   ; offset vehicle address by 0x224 and set its car lock
    xor     al, al                            ; return 0

Vice City

loc_4578E9:
    lea     eax, [ebp+10h]                    ; get address of script's current instruction pointer
    mov     ecx, ebp                          ; get address of script for thiscall
    push    2                                 ; push 2 for two parameters to collect
    push    eax                               ; push address of script's current instruction pointer
    call    CRunningScript::CollectParameters ; call CRunningScript::CollectParameters(uint *,short)
    mov     eax, ds:ScriptParams[0]           ; get value of first parameter, the vehicle handle
    mov     ecx, ds:CPools::ms_pVehiclePool   ; get address of vehicle pool for thiscall
    push    eax                               ; push vehicle handle
    call    CPool_CVehicle_CAutomobile::GetAt ; call CPool<CVehicle, CAutomobile>::GetAt(int) to get address of vehicle
    mov     ecx, ds:ScriptParams[1]           ; get value of second parameter, the car lock
    mov     [eax+230h], ecx                   ; offset vehicle address by 0x230 and set its car lock
    xor     al, al                            ; return 0

Keywords

set, car, vehicle, door, lock, status