Difference between revisions of "020A"

From GTAMods Wiki
Jump to navigation Jump to search
(updating page + lock names)
(example and disassembly)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{Icon|trilogy}} '''LOCK_CAR_DOORS'''
+
{{TocRight}}
<hr />
+
{{OpCode
<onlyinclude>{{#ifeq:{{{transcludesection|opcode}}}|opcode|
+
| games      = {{Icon|t}}
'''Description'''
+
| command    = LOCK_CAR_DOORS
: Sets the door lock status of the vehicle
+
| description = Sets the door lock status of the vehicle
'''Syntax'''
+
| syntax1    = 020A: set_car [''car handle''] door_status_to [''int'']
: 020A: set_car [''car handle''] door_status_to [''int'']
+
| p1t        = [''car handle'']
'''Parameter'''
+
| p1d        = The handle of the vehicle
: [''car handle'']
+
| p2t        = [''int'']
:: The handle of the vehicle
+
| p2d        = Car lock ([[#Car locks|see below]])
: [''int'']
+
| native      = [[LOCK_CAR_DOORS]]
:: Lock status
+
}}
'''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.
+
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]].
}}</onlyinclude>
 
  
{| {{prettytable}}
+
== Car locks ==
! Status || Name || Description
+
{|class="wikitable center-col-1"
 +
!Car lock ||[[SCM language III/VC definitions#CARLOCK|Enum]] ||Description
 
|-
 
|-
| 1 || CARLOCK_UNLOCKED || unlocked car
+
|0 ||CARLOCK_NONE ||
 
|-
 
|-
| 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
+
|1 ||CARLOCK_UNLOCKED ||unlocked car
 
|-
 
|-
| 3 || CARLOCK_LOCKOUT_PLAYER_ONLY || locked for the player, not locked for NPCs
+
|2 ||CARLOCK_LOCKED ||locked car &ndash; 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
 
|-
 
|-
| 4 || CARLOCK_LOCKED_PLAYER_INSIDE || locked, the player is stuck in the car
+
|3 ||CARLOCK_LOCKOUT_PLAYER_ONLY ||locked for the player, not locked for NPCs
 
|-
 
|-
| 5 || || locked when not in car, unlocks when in car
+
|4 ||CARLOCK_LOCKED_PLAYER_INSIDE ||locked, the player is stuck in the car
 
|-
 
|-
| 6 || CARLOCK_FORCE_SHUT_DOORS || animation will never leave door opened, always closes door
+
|5 ||CARLOCK_LOCKED_INITIALLY ||locked when not in car, unlocks when in car
 
|-
 
|-
| 7 || || locked but doors can fall off
+
|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
 
|}
 
|}
  
In GTA III, this opcode behaves exactly as opcode [[0135]].
+
== Example ==
 +
The following example allows the vehicle you are in to be locked when holding [[00E1|button 6]] (HANDBRAKE key) and unlocked when not holding it.
 +
{{Pre|class=sb-code|1=
 +
<span class="c1">// set constants</span>
 +
<span class="k">const</span>
 +
PLAYER_CAR = <span class="nv">0@</span>
 +
<span class="k">end</span>
 +
 
 +
<span class="k">while</span> <span class="k">true</span>
 +
    <span class="k">wait</span> <span class="m">10</span>
 +
    <span class="k">if</span>
 +
        [[0256]]:  player <span class="nv">$PLAYER_CHAR</span> defined
 +
    <span class="k">then</span>
 +
        <span class="k">if</span>
 +
            00DF:  actor <span class="nv">$PLAYER_ACTOR</span> in_any_car
 +
        <span class="k">then</span>
 +
            03C0: PLAYER_CAR = actor <span class="nv">$PLAYER_ACTOR</span> car_no_save
 +
            <span class="k">if</span>
 +
                [[00E1]]:  key_pressed <span class="m">0</span> <span class="m">6</span>  <span class="c1">// handbrake key</span>
 +
            <span class="k">then</span>
 +
                020A: set_car PLAYER_CAR door_status_to <span class="m">2</span>  <span class="c1">// CARLOCK_LOCKED</span>
 +
            <span class="k">else</span>
 +
                020A: set_car PLAYER_CAR door_status_to <span class="m">1</span>  <span class="c1">// CARLOCK_UNLOCKED</span>
 +
            <span class="k">end</span>
 +
        <span class="k">end</span>
 +
    <span class="k">end</span>
 +
<span class="k">end</span>
 +
}}
 +
 
 +
== Disassembled code ==
 +
These are disassembled code for this opcode both from PC v1.0 US.
 +
=== GTA III ===
 +
<syntaxhighlight lang="nasm">
 +
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
 +
</syntaxhighlight>
 +
 
 +
=== Vice City ===
 +
<syntaxhighlight lang="nasm">
 +
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
 +
</syntaxhighlight>
  
 
== Keywords ==
 
== Keywords ==
 
set, car, vehicle, door, lock, status
 
set, car, vehicle, door, lock, status
 
[[Category:OpCodes]]
 

Latest revision as of 23:36, 20 January 2017

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