Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- List of materials, note: it won't be hashed "as-is", the game now expect mateiral name to have a material index suffix!
- -- For instance, DEFAULT's hash won't be `GetHashKey("DEFAULT")`, it will be `GetHashKey("DEFAULT_0")`
- local materialNames = {
- "DEFAULT",
- "CONCRETE",
- "CONCRETE_PAVEMENT",
- "TARMAC",
- "ROCK",
- "ROCK_MOSSY",
- "STONE",
- "COBBLESTONE",
- "COBBLESTONE_DIRT",
- "BRICK",
- "BRICK_PAVEMENT",
- "MARBLE",
- "SANDSTONE_SOLID",
- "SANDSTONE_BRITTLE",
- "SAND_COMPACT",
- "SAND_WET",
- "SAND_DRY_DEEP",
- "SAND_WET_DEEP",
- "QUICKSAND",
- "ALGAE",
- "ALGAE_THICK",
- "TAR_PIT",
- "ICE",
- "SNOW_COMPACT",
- "SNOW_DEEP",
- "SLUSH",
- "GRAVEL_SMALL",
- "GRAVEL_LARGE",
- "GRAVEL_WET",
- "GRAVEL_DEEP",
- "GRAVEL_MUDDY",
- "GRAVEL_MUDDY_DEEP",
- "GRAVEL_DIRT",
- "GRAVEL_GRASS",
- "DIRT_TRACK",
- "DIRT_TRACK_DEEP",
- "DIRT_GRASS",
- "MUD_HARD",
- "MUD_POTHOLE",
- "MUD_SOFT",
- "MUD_UNDERWATER",
- "MUD_DEEP",
- "MARSH",
- "MARSH_DEEP",
- "SOIL",
- "SOIL_DEEP",
- "CLAY_HARD",
- "CLAY_SOFT",
- "ASH",
- "COAL",
- "MANURE",
- "MOSS",
- "MOSS_DEEP",
- "GRASS_DEAD",
- "GRASS_LUSH",
- "GRASS_LONG",
- "GRASS",
- "GRASS_SHORT",
- "HAY",
- "BUSHES",
- "SPARSE_BUSHES",
- "DENSE_BUSHES",
- "TWIGS",
- "PINE_NEEDLES",
- "LEAVES_DRY",
- "LEAVES_TOBACCO",
- "LEAVES",
- "LEAVES_MAPLE",
- "LEAVES_OAK",
- "LEAVES_FICUS",
- "WOODCHIPS",
- "TREE_PINE",
- "TREE_PINE_SNOW",
- "FLOWERS",
- "CROP_HUSK",
- "TREE_BARK",
- "CACTUS",
- "METAL_SOLID_SMALL",
- "METAL_SOLID_MEDIUM",
- "METAL_SOLID_LARGE",
- "METAL_HOLLOW_SMALL",
- "METAL_HOLLOW_MEDIUM",
- "METAL_HOLLOW_LARGE",
- "METAL_CHAINLINK_SMALL",
- "METAL_CORRUGATED_IRON",
- "METAL_GRILLE",
- "METAL_RAILING",
- "METAL_RAILING_TRAM",
- "METAL_DUCT",
- "METAL_PENETRABLE",
- "METAL_BARS",
- "WOOD_ROOF",
- "WOOD_BURNING",
- "WOOD_BURNT",
- "WOOD_CHIPS",
- "WOOD_SOLID_SMALL",
- "WOOD_SOLID_MEDIUM",
- "WOOD_SOLID_LARGE",
- "WOOD_SOLID_POLISHED",
- "WOOD_FLOOR_DUSTY",
- "WOOD_HOLLOW_SMALL",
- "WOOD_HOLLOW_MEDIUM",
- "WOOD_HOLLOW_LARGE",
- "WOOD_OLD_CREAKY",
- "WOOD_LATTICE",
- "WOOD_PENETRABLE",
- "CERAMIC",
- "ROOF_TILE",
- "TARPAULIN",
- "PLASTIC_CLEAR",
- "PLASTIC_HOLLOW_CLEAR",
- "PLASTIC_HIGH_DENSITY_CLEAR",
- "RUBBER",
- "CARPET_SOLID",
- "CARPET_SOLID_DUSTY",
- "CLOTH",
- "CLOTH_SACK",
- "PLASTER_SOLID",
- "PLASTER_BRITTLE",
- "PLASTER_PENETRABLE",
- "PAPER",
- "FEATHER_PILLOW",
- "LEATHER",
- "SLATTED_BLINDS",
- "UPHOLSTRY",
- "CURTAINS",
- "WICKER",
- "TERRACOTTA",
- "PORCELAIN",
- "TILE",
- "GRAIN_SACK",
- "SAND_BAG",
- "PAINT_CAN",
- "TRASH",
- "GLASS_SHOOT_THROUGH",
- "GLASS_BOTTLE_SHOT",
- "GLASS_BOTTLE_MEDICINE",
- "GLASS_BOTTLE_LIQUOR",
- "GLASS_BOTTLE_JUG",
- "GLASS_BULLETPROOF",
- "GLASS_BULLETPROOF_SEE_THROUGH",
- "GLASS_OPAQUE",
- "CAR_METAL",
- "CAR_SOFTTOP",
- "CAR_SOFTTOP_CLEAR",
- "CAR_GLASS_WEAK",
- "CAR_GLASS_MEDIUM",
- "CAR_GLASS_STRONG",
- "CAR_GLASS_BULLETPROOF",
- "CAR_GLASS_OPAQUE",
- "CAR_ENGINE",
- "VEH_WOOD",
- "WEAPON_WOOD",
- "WEAPON_METAL",
- "WATER_SHALLOW",
- "WATER",
- "BLOOD",
- "OIL",
- "PETROL",
- "PUDDLE",
- "PUDDLE_ANKLE",
- "WATER_ANKLE",
- "WATER_SHIN",
- "WATER_KNEE",
- "FRESH_MEAT",
- "DRIED_MEAT",
- "FURRY_MEAT",
- "PELT_FUR",
- "LEATHER_HIDE",
- "BONES",
- "EMISSIVE_GLASS",
- "EMISSIVE_PLASTIC",
- "VFX_METAL_ELECTRIFIED",
- "VFX_METAL_WATER_TOWER",
- "VFX_WOOD_BEER_BARREL",
- "VFX_METAL_STEAM",
- "VFX_METAL_FLAME",
- "PHYS_NO_FRICTION",
- "PHYS_CASTER",
- "PHYS_CAR_VOID",
- "PHYS_PED_CAPSULE",
- "PHYS_MACHINERY",
- "PHYS_BARBED_WIRE",
- "PHYS_BLOCKER",
- "PHYS_DYNAMIC_COVER_BOUND",
- "BUTTOCKS",
- "THIGH_LEFT",
- "SHIN_LEFT",
- "FOOT_LEFT",
- "THIGH_RIGHT",
- "SHIN_RIGHT",
- "FOOT_RIGHT",
- "SPINE0",
- "SPINE1",
- "SPINE2",
- "SPINE3",
- "CLAVICLE_LEFT",
- "UPPER_ARM_LEFT",
- "LOWER_ARM_LEFT",
- "HAND_LEFT",
- "CLAVICLE_RIGHT",
- "UPPER_ARM_RIGHT",
- "LOWER_ARM_RIGHT",
- "HAND_RIGHT",
- "NECK",
- "HEAD",
- "ANIMAL_DEFAULT",
- "PROP_ROCK",
- "PROP_STONE",
- "TAR_PAPER",
- "AM_BASE_WOOD_RAILROAD",
- "WOOD_RAILROAD",
- "BONE_LIGHT",
- "BONE_HEAVY",
- "WOOD_ROTTEN",
- "UNUSED_TARMAC_PAINTED",
- "UNUSED_TARMAC_POTHOLE",
- "UNUSED_RUMBLE_STRIP",
- "UNUSED_BREEZE_BLOCK",
- "UNUSED_PAVING_SLAB",
- "UNUSED_SAND_LOOSE",
- "UNUSED_SAND_TRACK",
- "UNUSED_SAND_UNDERWATER",
- "UNUSED_ICE_TARMAC",
- "UNUSED_SNOW_LOOSE",
- "UNUSED_SNOW_TARMAC",
- "UNUSED_GRAVEL_DEEP",
- "UNUSED_GRAVEL_TRAIN_TRACK",
- "UNUSED_METAL_CHAINLINK_LARGE",
- "UNUSED_METAL_GARAGE_DOOR",
- "UNUSED_METAL_MANHOLE",
- "UNUSED_WOOD_CHIPBOARD",
- "UNUSED_WOOD_HIGH_DENSITY",
- "UNUSED_WOOD_HIGH_FRICTION",
- "UNUSED_ROOF_FELT",
- "UNUSED_FIBREGLASS",
- "UNUSED_PLASTIC",
- "UNUSED_PLASTIC_HOLLOW",
- "UNUSED_PLASTIC_HIGH_DENSITY",
- "UNUSED_FIBREGLASS_HOLLOW",
- "UNUSED_RUBBER_HOLLOW",
- "UNUSED_LINOLEUM",
- "UNUSED_LAMINATE",
- "UNUSED_CARPET_FLOORBOARD",
- "UNUSED_CARDBOARD_SHEET",
- "UNUSED_CARDBOARD_BOX",
- "UNUSED_FOAM",
- "UNUSED_POLYSTYRENE",
- "UNUSED_TVSCREEN",
- "UNUSED_PERSPEX",
- "UNUSED_CAR_PLASTIC",
- "UNUSED_PHYS_GOLF_BALL",
- "UNUSED_PHYS_TENNIS_BALL",
- "UNUSED_PHYS_CASTER_RUSTY",
- "UNUSED_PHYS_ELECTRIC_METAL",
- "UNUSED_PHYS_POOLTABLE_SURFACE",
- "UNUSED_PHYS_POOLTABLE_CUSHION",
- "UNUSED_PHYS_POOLTABLE_BALL",
- }
- --- Polyfills
- if type(GetShapeTestResultIncludingMaterial) ~= "function" then
- GetShapeTestResultIncludingMaterial = function(shapeTest)
- return Citizen.InvokeNative(GetHashKey("GET_SHAPE_TEST_RESULT_INCLUDING_MATERIAL") & 0xFFFFFFFF, shapeTest,
- Citizen.PointerValueInt(), Citizen.PointerValueVector(), Citizen.PointerValueVector(),
- Citizen.PointerValueInt(), Citizen.PointerValueInt(), Citizen.ReturnResultAnyway())
- end
- end
- if type(DrawLine) ~= "function" then
- DrawLine = function(pos1, pos2, r, g, b, a)
- Citizen.InvokeNative(GetHashKey("DRAW_LINE") & 0xFFFFFFFF, pos1.x, pos1.y, pos1.z, pos2.x, pos2.y, pos2.z, r, g, b, a)
- end
- end
- --- Random utils
- local function DrawTextWorld(text, pos, scale)
- local retval, screenX, screenY = GetScreenCoordFromWorldCoord(pos.x, pos.y, pos.z)
- if not retval then
- return
- end
- SetTextScale(scale, scale)
- SetTextCentre(true)
- SetTextDropshadow(3, 0, 0, 0, 200)
- SetTextColor(255, 255, 255, 220)
- SetTextFontForCurrentCommand(1)
- DisplayText(CreateVarString(10, "LITERAL_STRING", text), screenX, screenY)
- end
- local function RotToDir(rot)
- local z = math.rad(rot.z)
- local x = math.rad(rot.x)
- local a = math.abs(math.cos(x))
- return vector3(-math.sin(z)*a, math.cos(z)*a, math.sin(x))
- end
- local function GetFarCoords(coords, rotation, dist)
- local direction = RotToDir(rotation)
- local farx = coords.x + direction.x * dist
- local fary = coords.y + direction.y * dist
- local farz = coords.z + direction.z * dist
- return vector3(farx, fary, farz)
- end
- --- Main thread
- CreateThread(function()
- local materialHashToName = {}
- -- Add material index suffinx for hash->name lookup.
- -- "DEFAULT" -> "DEFAULT_0", "PROP_ROCK" -> "PROP_ROCK_207", etc.
- for index, name in ipairs(materialNames) do
- local hashKey = GetHashKey(string.format("%s_%d", name, index - 1));
- materialHashToName[hashKey] = name
- end
- while true do
- Wait(1)
- local playerPed = PlayerPedId()
- local cameraCoords = GetGameplayCamCoord()
- local cameraRot = GetGameplayCamRot(0)
- local farCoords = GetFarCoords(cameraCoords, cameraRot, 1000.0)
- -- You shouldn't ever call this expensive native each frame, it's just for demonstration purposes!
- local shapeTest = StartExpensiveSynchronousShapeTestLosProbe(cameraCoords, farCoords, 255, playerPed, 0)
- local status, hit, endCoords, surfaceNormal, materialHash, entityHit = GetShapeTestResultIncludingMaterial(shapeTest)
- if status == 2 and tonumber(hit) == 1 then
- local playerCoords = GetEntityCoords(playerPed)
- DrawLine(playerCoords, endCoords, 0, 255, 0, 255)
- DrawLine(endCoords, endCoords + surfaceNormal * 10, 0, 0, 255, 255)
- if materialHashToName[materialHash] ~= nil then
- DrawTextWorld("~d~" .. materialHashToName[materialHash] .. "~n~~e~[" .. materialHash .. "]", endCoords, 0.5)
- else
- DrawTextWorld("UNKNOWN~n~~e~[" .. materialHash .. "]", endCoords, 0.5)
- end
- end
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement