Advertisement
Guest User

Untitled

a guest
Apr 15th, 2024
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.29 KB | None | 0 0
  1. -- List of materials, note: it won't be hashed "as-is", the game now expect mateiral name to have a material index suffix!
  2. -- For instance, DEFAULT's hash won't be `GetHashKey("DEFAULT")`, it will be `GetHashKey("DEFAULT_0")`
  3. local materialNames = {
  4.   "DEFAULT",
  5.   "CONCRETE",
  6.   "CONCRETE_PAVEMENT",
  7.   "TARMAC",
  8.   "ROCK",
  9.   "ROCK_MOSSY",
  10.   "STONE",
  11.   "COBBLESTONE",
  12.   "COBBLESTONE_DIRT",
  13.   "BRICK",
  14.   "BRICK_PAVEMENT",
  15.   "MARBLE",
  16.   "SANDSTONE_SOLID",
  17.   "SANDSTONE_BRITTLE",
  18.   "SAND_COMPACT",
  19.   "SAND_WET",
  20.   "SAND_DRY_DEEP",
  21.   "SAND_WET_DEEP",
  22.   "QUICKSAND",
  23.   "ALGAE",
  24.   "ALGAE_THICK",
  25.   "TAR_PIT",
  26.   "ICE",
  27.   "SNOW_COMPACT",
  28.   "SNOW_DEEP",
  29.   "SLUSH",
  30.   "GRAVEL_SMALL",
  31.   "GRAVEL_LARGE",
  32.   "GRAVEL_WET",
  33.   "GRAVEL_DEEP",
  34.   "GRAVEL_MUDDY",
  35.   "GRAVEL_MUDDY_DEEP",
  36.   "GRAVEL_DIRT",
  37.   "GRAVEL_GRASS",
  38.   "DIRT_TRACK",
  39.   "DIRT_TRACK_DEEP",
  40.   "DIRT_GRASS",
  41.   "MUD_HARD",
  42.   "MUD_POTHOLE",
  43.   "MUD_SOFT",
  44.   "MUD_UNDERWATER",
  45.   "MUD_DEEP",
  46.   "MARSH",
  47.   "MARSH_DEEP",
  48.   "SOIL",
  49.   "SOIL_DEEP",
  50.   "CLAY_HARD",
  51.   "CLAY_SOFT",
  52.   "ASH",
  53.   "COAL",
  54.   "MANURE",
  55.   "MOSS",
  56.   "MOSS_DEEP",
  57.   "GRASS_DEAD",
  58.   "GRASS_LUSH",
  59.   "GRASS_LONG",
  60.   "GRASS",
  61.   "GRASS_SHORT",
  62.   "HAY",
  63.   "BUSHES",
  64.   "SPARSE_BUSHES",
  65.   "DENSE_BUSHES",
  66.   "TWIGS",
  67.   "PINE_NEEDLES",
  68.   "LEAVES_DRY",
  69.   "LEAVES_TOBACCO",
  70.   "LEAVES",
  71.   "LEAVES_MAPLE",
  72.   "LEAVES_OAK",
  73.   "LEAVES_FICUS",
  74.   "WOODCHIPS",
  75.   "TREE_PINE",
  76.   "TREE_PINE_SNOW",
  77.   "FLOWERS",
  78.   "CROP_HUSK",
  79.   "TREE_BARK",
  80.   "CACTUS",
  81.   "METAL_SOLID_SMALL",
  82.   "METAL_SOLID_MEDIUM",
  83.   "METAL_SOLID_LARGE",
  84.   "METAL_HOLLOW_SMALL",
  85.   "METAL_HOLLOW_MEDIUM",
  86.   "METAL_HOLLOW_LARGE",
  87.   "METAL_CHAINLINK_SMALL",
  88.   "METAL_CORRUGATED_IRON",
  89.   "METAL_GRILLE",
  90.   "METAL_RAILING",
  91.   "METAL_RAILING_TRAM",
  92.   "METAL_DUCT",
  93.   "METAL_PENETRABLE",
  94.   "METAL_BARS",
  95.   "WOOD_ROOF",
  96.   "WOOD_BURNING",
  97.   "WOOD_BURNT",
  98.   "WOOD_CHIPS",
  99.   "WOOD_SOLID_SMALL",
  100.   "WOOD_SOLID_MEDIUM",
  101.   "WOOD_SOLID_LARGE",
  102.   "WOOD_SOLID_POLISHED",
  103.   "WOOD_FLOOR_DUSTY",
  104.   "WOOD_HOLLOW_SMALL",
  105.   "WOOD_HOLLOW_MEDIUM",
  106.   "WOOD_HOLLOW_LARGE",
  107.   "WOOD_OLD_CREAKY",
  108.   "WOOD_LATTICE",
  109.   "WOOD_PENETRABLE",
  110.   "CERAMIC",
  111.   "ROOF_TILE",
  112.   "TARPAULIN",
  113.   "PLASTIC_CLEAR",
  114.   "PLASTIC_HOLLOW_CLEAR",
  115.   "PLASTIC_HIGH_DENSITY_CLEAR",
  116.   "RUBBER",
  117.   "CARPET_SOLID",
  118.   "CARPET_SOLID_DUSTY",
  119.   "CLOTH",
  120.   "CLOTH_SACK",
  121.   "PLASTER_SOLID",
  122.   "PLASTER_BRITTLE",
  123.   "PLASTER_PENETRABLE",
  124.   "PAPER",
  125.   "FEATHER_PILLOW",
  126.   "LEATHER",
  127.   "SLATTED_BLINDS",
  128.   "UPHOLSTRY",
  129.   "CURTAINS",
  130.   "WICKER",
  131.   "TERRACOTTA",
  132.   "PORCELAIN",
  133.   "TILE",
  134.   "GRAIN_SACK",
  135.   "SAND_BAG",
  136.   "PAINT_CAN",
  137.   "TRASH",
  138.   "GLASS_SHOOT_THROUGH",
  139.   "GLASS_BOTTLE_SHOT",
  140.   "GLASS_BOTTLE_MEDICINE",
  141.   "GLASS_BOTTLE_LIQUOR",
  142.   "GLASS_BOTTLE_JUG",
  143.   "GLASS_BULLETPROOF",
  144.   "GLASS_BULLETPROOF_SEE_THROUGH",
  145.   "GLASS_OPAQUE",
  146.   "CAR_METAL",
  147.   "CAR_SOFTTOP",
  148.   "CAR_SOFTTOP_CLEAR",
  149.   "CAR_GLASS_WEAK",
  150.   "CAR_GLASS_MEDIUM",
  151.   "CAR_GLASS_STRONG",
  152.   "CAR_GLASS_BULLETPROOF",
  153.   "CAR_GLASS_OPAQUE",
  154.   "CAR_ENGINE",
  155.   "VEH_WOOD",
  156.   "WEAPON_WOOD",
  157.   "WEAPON_METAL",
  158.   "WATER_SHALLOW",
  159.   "WATER",
  160.   "BLOOD",
  161.   "OIL",
  162.   "PETROL",
  163.   "PUDDLE",
  164.   "PUDDLE_ANKLE",
  165.   "WATER_ANKLE",
  166.   "WATER_SHIN",
  167.   "WATER_KNEE",
  168.   "FRESH_MEAT",
  169.   "DRIED_MEAT",
  170.   "FURRY_MEAT",
  171.   "PELT_FUR",
  172.   "LEATHER_HIDE",
  173.   "BONES",
  174.   "EMISSIVE_GLASS",
  175.   "EMISSIVE_PLASTIC",
  176.   "VFX_METAL_ELECTRIFIED",
  177.   "VFX_METAL_WATER_TOWER",
  178.   "VFX_WOOD_BEER_BARREL",
  179.   "VFX_METAL_STEAM",
  180.   "VFX_METAL_FLAME",
  181.   "PHYS_NO_FRICTION",
  182.   "PHYS_CASTER",
  183.   "PHYS_CAR_VOID",
  184.   "PHYS_PED_CAPSULE",
  185.   "PHYS_MACHINERY",
  186.   "PHYS_BARBED_WIRE",
  187.   "PHYS_BLOCKER",
  188.   "PHYS_DYNAMIC_COVER_BOUND",
  189.   "BUTTOCKS",
  190.   "THIGH_LEFT",
  191.   "SHIN_LEFT",
  192.   "FOOT_LEFT",
  193.   "THIGH_RIGHT",
  194.   "SHIN_RIGHT",
  195.   "FOOT_RIGHT",
  196.   "SPINE0",
  197.   "SPINE1",
  198.   "SPINE2",
  199.   "SPINE3",
  200.   "CLAVICLE_LEFT",
  201.   "UPPER_ARM_LEFT",
  202.   "LOWER_ARM_LEFT",
  203.   "HAND_LEFT",
  204.   "CLAVICLE_RIGHT",
  205.   "UPPER_ARM_RIGHT",
  206.   "LOWER_ARM_RIGHT",
  207.   "HAND_RIGHT",
  208.   "NECK",
  209.   "HEAD",
  210.   "ANIMAL_DEFAULT",
  211.   "PROP_ROCK",
  212.   "PROP_STONE",
  213.   "TAR_PAPER",
  214.   "AM_BASE_WOOD_RAILROAD",
  215.   "WOOD_RAILROAD",
  216.   "BONE_LIGHT",
  217.   "BONE_HEAVY",
  218.   "WOOD_ROTTEN",
  219.   "UNUSED_TARMAC_PAINTED",
  220.   "UNUSED_TARMAC_POTHOLE",
  221.   "UNUSED_RUMBLE_STRIP",
  222.   "UNUSED_BREEZE_BLOCK",
  223.   "UNUSED_PAVING_SLAB",
  224.   "UNUSED_SAND_LOOSE",
  225.   "UNUSED_SAND_TRACK",
  226.   "UNUSED_SAND_UNDERWATER",
  227.   "UNUSED_ICE_TARMAC",
  228.   "UNUSED_SNOW_LOOSE",
  229.   "UNUSED_SNOW_TARMAC",
  230.   "UNUSED_GRAVEL_DEEP",
  231.   "UNUSED_GRAVEL_TRAIN_TRACK",
  232.   "UNUSED_METAL_CHAINLINK_LARGE",
  233.   "UNUSED_METAL_GARAGE_DOOR",
  234.   "UNUSED_METAL_MANHOLE",
  235.   "UNUSED_WOOD_CHIPBOARD",
  236.   "UNUSED_WOOD_HIGH_DENSITY",
  237.   "UNUSED_WOOD_HIGH_FRICTION",
  238.   "UNUSED_ROOF_FELT",
  239.   "UNUSED_FIBREGLASS",
  240.   "UNUSED_PLASTIC",
  241.   "UNUSED_PLASTIC_HOLLOW",
  242.   "UNUSED_PLASTIC_HIGH_DENSITY",
  243.   "UNUSED_FIBREGLASS_HOLLOW",
  244.   "UNUSED_RUBBER_HOLLOW",
  245.   "UNUSED_LINOLEUM",
  246.   "UNUSED_LAMINATE",
  247.   "UNUSED_CARPET_FLOORBOARD",
  248.   "UNUSED_CARDBOARD_SHEET",
  249.   "UNUSED_CARDBOARD_BOX",
  250.   "UNUSED_FOAM",
  251.   "UNUSED_POLYSTYRENE",
  252.   "UNUSED_TVSCREEN",
  253.   "UNUSED_PERSPEX",
  254.   "UNUSED_CAR_PLASTIC",
  255.   "UNUSED_PHYS_GOLF_BALL",
  256.   "UNUSED_PHYS_TENNIS_BALL",
  257.   "UNUSED_PHYS_CASTER_RUSTY",
  258.   "UNUSED_PHYS_ELECTRIC_METAL",
  259.   "UNUSED_PHYS_POOLTABLE_SURFACE",
  260.   "UNUSED_PHYS_POOLTABLE_CUSHION",
  261.   "UNUSED_PHYS_POOLTABLE_BALL",
  262. }
  263.  
  264. --- Polyfills
  265.  
  266. if type(GetShapeTestResultIncludingMaterial) ~= "function" then
  267.   GetShapeTestResultIncludingMaterial = function(shapeTest)
  268.     return Citizen.InvokeNative(GetHashKey("GET_SHAPE_TEST_RESULT_INCLUDING_MATERIAL") & 0xFFFFFFFF, shapeTest,
  269.       Citizen.PointerValueInt(), Citizen.PointerValueVector(), Citizen.PointerValueVector(),
  270.       Citizen.PointerValueInt(), Citizen.PointerValueInt(), Citizen.ReturnResultAnyway())
  271.   end
  272. end
  273. if type(DrawLine) ~= "function" then
  274.   DrawLine = function(pos1, pos2, r, g, b, a)
  275.     Citizen.InvokeNative(GetHashKey("DRAW_LINE") & 0xFFFFFFFF, pos1.x, pos1.y, pos1.z, pos2.x, pos2.y, pos2.z, r, g, b, a)
  276.   end
  277. end
  278.  
  279. --- Random utils
  280.  
  281. local function DrawTextWorld(text, pos, scale)
  282.   local retval, screenX, screenY = GetScreenCoordFromWorldCoord(pos.x, pos.y, pos.z)
  283.   if not retval then
  284.     return
  285.   end
  286.  
  287.   SetTextScale(scale, scale)
  288.   SetTextCentre(true)
  289.   SetTextDropshadow(3, 0, 0, 0, 200)
  290.   SetTextColor(255, 255, 255, 220)
  291.   SetTextFontForCurrentCommand(1)
  292.  
  293.   DisplayText(CreateVarString(10, "LITERAL_STRING", text), screenX, screenY)
  294. end
  295.  
  296. local function RotToDir(rot)
  297.   local z = math.rad(rot.z)
  298.   local x = math.rad(rot.x)
  299.   local a = math.abs(math.cos(x))
  300.   return vector3(-math.sin(z)*a, math.cos(z)*a, math.sin(x))
  301. end
  302.  
  303. local function GetFarCoords(coords, rotation, dist)
  304.   local direction = RotToDir(rotation)
  305.   local farx = coords.x + direction.x * dist
  306.   local fary = coords.y + direction.y * dist
  307.   local farz = coords.z + direction.z * dist
  308.   return vector3(farx, fary, farz)
  309. end
  310.  
  311. --- Main thread
  312.  
  313. CreateThread(function()
  314.   local materialHashToName = {}
  315.  
  316.   -- Add material index suffinx for hash->name lookup.
  317.   -- "DEFAULT" -> "DEFAULT_0", "PROP_ROCK" -> "PROP_ROCK_207", etc.
  318.   for index, name in ipairs(materialNames) do
  319.     local hashKey = GetHashKey(string.format("%s_%d", name, index - 1));
  320.     materialHashToName[hashKey] = name
  321.   end
  322.  
  323.   while true do
  324.     Wait(1)
  325.  
  326.     local playerPed = PlayerPedId()
  327.     local cameraCoords = GetGameplayCamCoord()
  328.     local cameraRot = GetGameplayCamRot(0)
  329.     local farCoords = GetFarCoords(cameraCoords, cameraRot, 1000.0)
  330.  
  331.     -- You shouldn't ever call this expensive native each frame, it's just for demonstration purposes!
  332.     local shapeTest = StartExpensiveSynchronousShapeTestLosProbe(cameraCoords, farCoords, 255, playerPed, 0)
  333.  
  334.     local status, hit, endCoords, surfaceNormal, materialHash, entityHit = GetShapeTestResultIncludingMaterial(shapeTest)
  335.  
  336.     if status == 2 and tonumber(hit) == 1 then
  337.       local playerCoords = GetEntityCoords(playerPed)
  338.       DrawLine(playerCoords, endCoords, 0, 255, 0, 255)
  339.       DrawLine(endCoords, endCoords + surfaceNormal * 10, 0, 0, 255, 255)
  340.  
  341.       if materialHashToName[materialHash] ~= nil then
  342.         DrawTextWorld("~d~" .. materialHashToName[materialHash] .. "~n~~e~[" .. materialHash .. "]", endCoords, 0.5)
  343.       else
  344.         DrawTextWorld("UNKNOWN~n~~e~[" .. materialHash .. "]", endCoords, 0.5)
  345.       end
  346.     end
  347.   end
  348. end)
  349.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement