ProcessLineOfSight: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
Line 32: Line 32:
===Returns===
===Returns===
*'''hit:''' ''true'' if there is a collision, ''false'' otherwise
*'''hit:''' ''true'' if there is a collision, ''false'' otherwise
The other return values are only filled if there is a collision, they contain ''nil'' otherwise
The other values are only filled if there is a collision, they contain ''nil'' otherwise
*'''hitX, hitY, hitZ:''' collision position
*'''hitX, hitY, hitZ:''' collision position
*'''hitElement:''' the MTA element hit if any, ''nil'' otherwise
*'''hitElement:''' the MTA element hit if any, ''nil'' otherwise
From MTA 1.1 onward:
*'''normalX, normalY, normalZ:''' the normal of the surface hit
*'''normalX, normalY, normalZ:''' the normal of the surface hit
*'''material:''' an integer representing the [[Material IDs|GTASA material ID]] of the surface hit when applicable (world, objects)
*'''material:''' an integer representing the [[Material IDs|GTASA material ID]] of the surface hit when applicable (world, objects)

Revision as of 17:28, 9 November 2010

This function checks if there is anything between 2 points in the world, and if there is, tells you where and what. The two positions must be within the local player's draw distance as the collision data is not loaded outside this area.

This function is useful for checking for collisions and for editor-style scripts. If you wish to get an element that's positioned at a particular point on the screen, use this function combined with getWorldFromScreenPosition. If you wish to just know if something is hit, and don't care about what or where was hit, use isLineOfSightClear.

Syntax

bool float float float element float float float int int int processLineOfSight ( float startX, float startY, float startZ, float endX, float endY, float endZ, [ bool checkBuildings = true, bool checkVehicles = true, bool checkPlayers = true, bool checkObjects = true, bool checkDummies = true, bool seeThroughStuff = false, bool ignoreSomeObjectsForCamera = false, bool shootThroughStuff = false, element ignoredElement = nil ] )

Required Arguments

  • startX: The start x position
  • startY: The start y position
  • startZ: The start z position
  • endX: The end x position
  • endY: The end y position
  • endZ: The end z position

Optional Arguments

NOTE: When using optional arguments, you might need to supply all arguments before the one you wish to use. For more information on optional arguments, see optional arguments.

  • checkBuildings: Allow the line of sight to be blocked by GTA's internally placed buildings, i.e. the world map.
  • checkVehicles: Allow the line of sight to be blocked by vehicles.
  • checkPlayers: Allow the line of sight to be blocked by players.
  • checkObjects: Allow the line of sight to be blocked by objects.
  • checkDummies: Allow the line of sight to be blocked by GTA's internal dummies. These are not used in the current MTA version so this argument can be set to false.
  • seeThroughStuff: Allow the line of sight to be blocked by translucent game objects, e.g. glass.
  • ignoreSomeObjectsForCamera: Allow the line of sight to be blocked by certain objects.
  • shootThroughStuff: Allow the line of sight to be blocked by things that can be shot through
  • ignoredElement: Allow the line of sight to pass through a certain specified element.

Returns

  • hit: true if there is a collision, false otherwise

The other values are only filled if there is a collision, they contain nil otherwise

  • hitX, hitY, hitZ: collision position
  • hitElement: the MTA element hit if any, nil otherwise

From MTA 1.1 onward:

  • normalX, normalY, normalZ: the normal of the surface hit
  • material: an integer representing the GTASA material ID of the surface hit when applicable (world, objects)
  • lighting: an integer between 0 (fully dark) and 255 (bright) representing the lighting intensity of the surface hit. This intensity is related to the lighting intensity the ped gets when standing on this surface (more than 100 in general, less than 20 in dark areas, and 0 to 1 in stealth parts of Madd Dogg's mansion)
  • piece: an integer representing the part of the element hit if hitElement is a vehicle or a ped/player, 0 otherwise.
    • For a ped/player, piece represents the body part hit:
  • 3: Torso
  • 4: Ass
  • 5: Left Arm
  • 6: Right Arm
  • 7: Left Leg
  • 8: Right Leg
  • 9: Head
    • For vehicles, piece represents the vehicle part hit:
  • 0: Frame
  • 2: Trunk
  • 3: Hood
  • 4: Rear
  • 5: Front left door
  • 6: Front right door
  • 7: Rear left door
  • 8: Rear right door
  • 13: Front Left tyre
  • 14: Front Right tyre
  • 15: Back Left tyre
  • 16: Back Right tyre

(Other potential IDs haven't been documented yet and might depend on vehicle model)

Example

This example shows how you can tell what position and element the camera is looking at, up to 50 units away.

local w, h = guiGetScreenSize ()
local tx, ty, tz = getWorldFromScreenPosition ( w/2, h/2, 50 )
local px, py, pz = getCameraMatrix()
hit, x, y, z, elementHit = processLineOfSight ( px, py, pz, tx, ty, tz )
if hit then
    outputChatBox ( "Looking at " .. x .. ", " .. y .. ", " ..  z )
    if elementHit then
        outputChatBox ( "Hit element " .. getElementType(elementHit) )
    end
end

See Also