====302====
place_name TSpawn
classname env_cs_place
origin -16.000000 -1520.000000 104.000000
angles 0.000000 0.000000 0.000000
scales 1.000000 1.000000 1.000000
hammeruniqueid 2:31046:5
model maps\de_anubis\entities\unnamed_2_31046_5.vmdl
Parse the associated (all of them) model files (shape should be the same as the world_physics)
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
m_nFlags = 0
m_nRefCounter = 0
m_bonesHash =
[
]
m_boneNames =
[
]
m_indexNames =
[
]
m_indexHash =
[
]
m_bindPose =
[
]
m_parts =
[
{
m_nFlags = 0
m_flMass = 0.000000
m_rnShape =
{
m_spheres =
[
]
m_capsules =
[
]
m_hulls =
[
{
m_nCollisionAttributeIndex = 0
m_nSurfacePropertyIndex = 0
m_UserFriendlyName = ""
m_bUserFriendlyNameSealed = false
m_bUserFriendlyNameLong = false
m_nToolMaterialHash = 86479102
m_sHitGroupName = "HITGROUP_INVALID"
m_Hull =
{
m_vCentroid =
[
0.000000,
0.000000,
0.000000,
]
m_flMaxAngularRadius = 40.422768
m_Bounds =
{
m_vMinBounds =
[
-23.000000,
-23.000004,
-24.000000,
]
m_vMaxBounds =
[
23.000000,
23.000004,
24.000000,
]
}
m_vOrthographicAreas =
[
1.000000,
1.000000,
1.000000,
]
m_MassProperties =
[
37410896.000000,
0.000000,
0.000000,
0.000000,
0.000000,
37410888.000000,
0.000000,
0.000000,
0.000000,
0.000000,
35819664.000000,
0.000000,
]
m_flVolume = 101568.015625
m_flSurfaceArea = 13064.000977
m_nFlags = 3
m_pRegionSVM =
{
m_Planes =
#[
00 00 00 00 00 00 80 3F 00 00 00 00 02 00 B8 41 00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 41
00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 41 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 B8 41
00 00 00 00 00 00 00 00 00 00 80 3F 00 00 C0 41 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 41
00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 41 00 00 80 3F 00 00 00 80 00 00 00 00 00 00 B8 C1
00 00 00 00 00 00 00 00 00 00 80 3F 00 00 C0 41 00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 C1
00 00 00 00 00 00 00 00 00 00 80 3F 00 00 C0 41 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 C1
00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 41 00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 C1
00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 41 00 00 00 80 00 00 80 BF 00 00 00 80 02 00 B8 C1
00 00 80 3F 00 00 00 00 00 00 00 00 00 00 B8 41 00 00 00 00 00 00 00 00 00 00 80 3F 00 00 C0 C1
00 00 80 3F 00 00 00 00 00 00 00 00 00 00 B8 41 00 00 00 80 00 00 80 3F 00 00 00 00 02 00 B8 C1
00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 41 00 00 00 00 00 00 00 00 00 00 80 3F 00 00 C0 C1
00 00 80 3F 00 00 00 00 00 00 00 00 00 00 B8 41 00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 C1
00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 41 00 00 00 00 00 00 80 3F 00 00 00 80 02 00 B8 C1
00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 41 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 B8 C1
00 00 00 00 00 00 80 3F 00 00 00 00 02 00 B8 41 00 00 00 00 00 00 00 80 00 00 80 3F 00 00 C0 C1
00 00 00 00 00 00 00 00 00 00 80 3F 00 00 C0 41 00 00 00 00 00 00 80 3F 00 00 00 00 02 00 B8 C1
00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 41 00 00 80 BF 00 00 00 80 00 00 00 80 00 00 B8 C1
00 00 00 00 00 00 80 3F 00 00 00 00 02 00 B8 41 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 C1
00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 41 00 00 00 80 00 00 00 00 00 00 80 3F 00 00 C0 C1
00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 41 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 C1
00 00 00 00 00 00 80 3F 00 00 00 00 02 00 B8 41 00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 C1
00 00 00 00 00 00 80 3F 00 00 00 00 02 00 B8 41 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 B8 C1
00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 41 00 00 00 80 00 00 00 80 00 00 80 BF 00 00 C0 C1
00 00 80 3F 00 00 00 00 00 00 00 00 00 00 B8 41 00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 C1
00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 41 00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 C1
00 00 00 00 00 00 00 00 00 00 80 3F 00 00 C0 41 00 00 80 3F 00 00 00 00 00 00 00 80 00 00 B8 C1
00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 41 00 00 00 00 00 00 80 3F 00 00 00 00 02 00 B8 C1
]
m_Nodes =
#[
00 00 00 80 01 00 06 80 02 00 02 80 03 00 0E 80 04 00 08 80 05 00 12 80 06 00 01 80 05 00 00 20
06 00 10 80 07 00 2E 80 08 00 07 80 09 00 1E 80 0A 00 14 80 0B 00 1B 80 0C 00 04 80 04 03 00 20
04 00 00 40 00 02 00 20 0A 00 30 80 0B 00 0B 80 00 00 00 40 02 08 00 20 0A 00 20 80 0B 00 32 80
0C 00 15 80 0D 00 23 80 0A 00 00 40 0D 00 27 80 0E 00 03 80 01 01 00 20 14 00 00 40 00 00 00 60
02 00 00 40 06 06 00 20 0C 00 00 40 03 09 00 20 08 00 34 80 09 00 17 80 06 00 00 40 01 00 00 60
0E 00 00 40 07 00 2B 80 10 00 00 40 03 00 00 60 06 00 05 80 07 07 00 20 16 00 00 40 02 00 00 60
08 00 00 40 04 00 00 60 12 00 00 40 05 00 00 60 00 00 00 00
]
}
m_Vertices =
#[
14 12 10 16 0E 04 06 0A
]
m_VertexPositions =
#[
00 00 B8 41 02 00 B8 41 00 00 C0 41 00 00 B8 C1 02 00 B8 41 00 00 C0 41 00 00 B8 41 02 00 B8 C1
00 00 C0 41 00 00 B8 C1 02 00 B8 C1 00 00 C0 41 00 00 B8 41 02 00 B8 41 00 00 C0 C1 00 00 B8 C1
02 00 B8 41 00 00 C0 C1 00 00 B8 41 02 00 B8 C1 00 00 C0 C1 00 00 B8 C1 02 00 B8 C1 00 00 C0 C1
]
m_Edges =
#[
15 01 05 00 0B 00 01 05 05 03 00 00 11 02 04 03 0E 05 05 01 00 04 04 00 0A 07 06 01 0D 06 07 02
16 09 02 02 10 08 03 04 04 0B 07 01 17 0A 05 05 0F 0D 02 03 08 0C 06 02 06 0F 04 01 03 0E 06 03
14 11 02 04 0C 10 00 03 09 13 01 04 01 12 03 05 12 15 00 04 02 14 01 00 07 17 03 02 13 16 07 05
]
m_Faces =
#[
00 04 08 0C 10 0B
]
m_Planes =
#[
00 00 00 00 00 00 80 3F 00 00 00 00 02 00 B8 41 00 00 00 00 00 00 00 00 00 00 80 BF 00 00 C0 41
00 00 00 00 00 00 80 BF 00 00 00 00 02 00 B8 41 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 B8 41
00 00 00 00 00 00 00 00 00 00 80 3F 00 00 C0 41 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 B8 41
]
}
},
]
m_meshes =
[
]
m_CollisionAttributeIndices =
[
]
}
m_nCollisionAttributeIndex = 0
m_nReserved = 0
m_flInertiaScale = 1.000000
m_flLinearDamping = 0.000000
m_flAngularDamping = 0.000000
m_bOverrideMassCenter = false
m_vMassCenterOverride =
[
0.000000,
0.000000,
0.000000,
]
},
]
m_constraints2 =
[
]
m_joints =
[
]
m_pFeModel = null
m_boneParents =
[
]
m_surfacePropertyHashes =
[
1977497166,
]
m_collisionAttributes =
[
{
m_CollisionGroup = 1977497166
m_InteractAs =
[
]
m_InteractWith =
[
]
m_InteractExclude =
[
]
m_CollisionGroupString = "default"
m_InteractAsStrings =
[
]
m_InteractWithStrings =
[
]
m_InteractExcludeStrings =
[
]
},
]
m_debugPartNames =
[
]
m_embeddedKeyvalues = ""
}
@dataclass
class Place:
callout: str
origin: Vector3
triangles: list[Triangles]
def callout(player_pos: Vector3, places: list[Place]) -> str:
for place in places:
collision_checker = VisibilityChecker(triangles=place.triangles)
if collision_checker.is_visible(player_pos, place.origin):
return place.callout
return "Unknown"
Parse default_vents for
classname env_cs_placeParse the associated (all of them) model files (shape should be the same as the world_physics)
Then we have can build a dataclass
We can probably save a mapping
map_name -> list[Place]in a json. Will have to see how big it is.Then we can define a function