• Getting data from world props?
    6 replies, posted
I recently made a stealth system that lets players walk into bushes to become less visible that works for any entity using a bush/tallgrass model. I later noticed how it didn't work with the bushes built into maps so I tried to get the entity of those bushes using EyeTrace but it kept returning worldspawn, even at static models. Not even ents.GetAll() has a single prop_static in it. Is there any way at all to get a static props model/position?
Either it is a different type of prop, check [url]https://developer.valvesoftware.com/wiki/Prop_Types_Overview[/url] , or it cannot be acquired by Lua, but I believe there should be a way to do it.
I honestly don't think there is a way to do it, I just ran my own map using all entities from that list and I couldn't get prop_detail or prop_static using lua. [B]Edit:[/B] Only way I could see it working would be by making some module but I have no idea how to do that. :disappoint:
You can probably still grab what texture and or material from the trace and work off of that
[QUOTE=dence47;52618712]You can probably still grab what texture and or material from the trace and work off of that[/QUOTE] Yep thats what im trying right now, my custom footstep system seems to detect when i walk in a bush. [B]Edit:[/B] Strange enough, prop_ragdoll is the only entity I can use to make a fully functional bush for my script. prop_static works like it should, only problem is that it doesn't affect the players visibility. prop_detail turns into a fully static model that is impossible to go through and has a few hundred layers of shadows from the looks of it. prop_physics works like it should but you cant shoot through it. prop_ragdoll works like it should.
the HitBox key in TraceResult contains the internal index for the static prop -- if you're desperate enough, you could try parsing model/origin/angle from the bsp file.
if you/somebody still needs a way to get the location of a prop_static, you can use this: [CODE] local GAMELUMP_STATIC_PROPS = "sprp" local STATIC_PROP_NAME_LENGTH = 128 local LUMP_GAME_LUMP = 35 local LUMP_HEADER_SIZE = 16 -- size of StaticPropLump_t excluding origin/angle/proptype -- todo: use the actual size of StaticPropLump_t... local SUPPORTED_VERSIONS = { -- [4] = 30, untested [5] = 34, [6] = 38, -- [7] = 42, untested -- [8] = 42 untested } local function ReadInteger(f, numBytes) local bytes = f:Read(numBytes) local shift = 8*(numBytes-1) local number = 0 for i = 1, numBytes do number = number + bit.lshift(string.byte(bytes, numBytes - i + 1), shift - (i-1)*8) end return number end local function ReadStaticPropDict(f) local dict = {} local count = ReadInteger(f, 4) for i = 0, count - 1 do local bname = f:Read(STATIC_PROP_NAME_LENGTH) local name = string.sub(bname, 1, string.find(bname, "\0")) dict[i] = name end return dict end local function ReadStaticPropLump(f, dict, version) local propLump = {} local count = ReadInteger(f, 4) for i = 1, count do local origin = Vector(f:ReadFloat(), f:ReadFloat(), f:ReadFloat()) local angle = Angle(f:ReadFloat(), f:ReadFloat(), f:ReadFloat()) local proptype = ReadInteger(f, 2) f:Skip(SUPPORTED_VERSIONS[version]) propLump[i] = { origin = origin, angle = angle, model = dict[proptype]} end return propLump end function GetStaticPropInfo(map) if not map then map = "maps/" .. game.GetMap() .. ".bsp" end local f = file.Open(map, "rb", "GAME") if not f then error("Couldn't open map: " .. map) end f:Skip(4 + 4) -- ident + version f:Skip(LUMP_HEADER_SIZE * LUMP_GAME_LUMP) local fileofs = ReadInteger(f, 4) f:Seek(fileofs) local lumpCount = ReadInteger(f, 4) for i = 1, lumpCount do local crc = f:Read(4) if crc == string.reverse(GAMELUMP_STATIC_PROPS) then f:Skip(2) -- flags local version = ReadInteger(f, 2) if not SUPPORTED_VERSIONS[version] then f:Close() error("Unsupported LUMP_GAME_LUMP version: " .. version ) end local fileofs = ReadInteger(f, 4) local filelen = ReadInteger(f, 4) f:Seek(fileofs) -- todo: single function for GAMELUMP_STATIC_PROPS parsing? local dict = ReadStaticPropDict(f) f:Skip(ReadInteger(f, 4) * 2) -- skip leaf list local propLump = ReadStaticPropLump(f, dict, version) local pos = f:Tell() f:Close() assert(pos == fileofs + filelen) return propLump end f:Skip(2 + 2 + 4 + 4) -- flags + version + fileofs + filelen end f:Close() end [/CODE] It's a bit unpolished and might not work for every map (some source engine games use a different/updated format to store static props) Example usage: [CODE] local propInfo = GetStaticPropInfo() concommand.Add("static_prop_info", function(ply, cmd, args) local tr = ply:GetEyeTrace() if tr.Entity == game.GetWorld() and tr.HitBox ~= 0 then local info = propInfo[tr.HitBox] ply:ChatPrint("Model: " .. info.model) ply:ChatPrint("Origin: " .. tostring(info.origin)) ply:ChatPrint("Angle: " .. tostring(info.angle)) end end) [/CODE]
Sorry, you need to Log In to post a reply to this thread.