Source code for engines.trace
# ../engines/trace.py
"""Provides ray tracing functionality."""
# =============================================================================
# >> IMPORTS
# =============================================================================
# Python Imports
# Enum
from enum import IntFlag
# Source.Python Imports
# Entities
from entities.helpers import inthandle_from_baseentity
# =============================================================================
# >> FORWARD IMPORTS
# =============================================================================
# Source.Python Imports
# Engines
from _engines._trace import Ray
from _engines._trace import engine_trace
from _engines._trace import BaseTrace
from _engines._trace import DisplacementFlags
from _engines._trace import GameTrace
from _engines._trace import Surface
from _engines._trace import SurfaceFlags
from _engines._trace import TraceFilter
from _engines._trace import EntityEnumerator
from _engines._trace import TraceType
from _engines._trace import CONTENTS_EMPTY
from _engines._trace import CONTENTS_SOLID
from _engines._trace import CONTENTS_WINDOW
from _engines._trace import CONTENTS_AUX
from _engines._trace import CONTENTS_GRATE
from _engines._trace import CONTENTS_SLIME
from _engines._trace import CONTENTS_WATER
from _engines._trace import CONTENTS_BLOCKLOS
from _engines._trace import CONTENTS_OPAQUE
from _engines._trace import LAST_VISIBLE_CONTENTS
from _engines._trace import ALL_VISIBLE_CONTENTS
from _engines._trace import CONTENTS_TESTFOGVOLUME
from _engines._trace import CONTENTS_UNUSED
from _engines._trace import CONTENTS_TEAM1
from _engines._trace import CONTENTS_TEAM2
from _engines._trace import CONTENTS_IGNORE_NODRAW_OPAQUE
from _engines._trace import CONTENTS_MOVEABLE
from _engines._trace import CONTENTS_AREAPORTAL
from _engines._trace import CONTENTS_PLAYERCLIP
from _engines._trace import CONTENTS_MONSTERCLIP
from _engines._trace import CONTENTS_CURRENT_0
from _engines._trace import CONTENTS_CURRENT_90
from _engines._trace import CONTENTS_CURRENT_180
from _engines._trace import CONTENTS_CURRENT_270
from _engines._trace import CONTENTS_CURRENT_UP
from _engines._trace import CONTENTS_CURRENT_DOWN
from _engines._trace import CONTENTS_ORIGIN
from _engines._trace import CONTENTS_MONSTER
from _engines._trace import CONTENTS_DEBRIS
from _engines._trace import CONTENTS_DETAIL
from _engines._trace import CONTENTS_TRANSLUCENT
from _engines._trace import CONTENTS_LADDER
from _engines._trace import CONTENTS_HITBOX
from _engines._trace import COORD_EXTENT
from _engines._trace import MASK_ALL
from _engines._trace import MASK_SOLID
from _engines._trace import MASK_PLAYERSOLID
from _engines._trace import MASK_NPCSOLID
from _engines._trace import MASK_WATER
from _engines._trace import MASK_OPAQUE
from _engines._trace import MASK_OPAQUE_AND_NPCS
from _engines._trace import MASK_BLOCKLOS
from _engines._trace import MASK_BLOCKLOS_AND_NPCS
from _engines._trace import MASK_VISIBLE
from _engines._trace import MASK_VISIBLE_AND_NPCS
from _engines._trace import MASK_SHOT
from _engines._trace import MASK_SHOT_HULL
from _engines._trace import MASK_SHOT_PORTAL
from _engines._trace import MASK_SOLID_BRUSHONLY
from _engines._trace import MASK_PLAYERSOLID_BRUSHONLY
from _engines._trace import MASK_NPCWORLDSTATIC
from _engines._trace import MASK_SPLITAREAPORTAL
from _engines._trace import MASK_CURRENT
from _engines._trace import MASK_DEADSOLID
from _engines._trace import MAX_COORD_INTEGER
from _engines._trace import MAX_COORD_FRACTION
from _engines._trace import MAX_COORD_FLOAT
from _engines._trace import MAX_TRACE_LENGTH
from _engines._trace import MAX_COORD_RANGE
from _engines._trace import MIN_COORD_INTEGER
from _engines._trace import MIN_COORD_FRACTION
from _engines._trace import MIN_COORD_FLOAT
# =============================================================================
# >> ALL DECLARATION
# =============================================================================
__all__ = ('BaseTrace',
'COORD_EXTENT',
'ContentFlags',
'ContentMasks',
'DisplacementFlags',
'EntityEnumerator',
'GameTrace',
'MAX_COORD_FLOAT',
'MAX_COORD_FRACTION',
'MAX_COORD_INTEGER',
'MAX_COORD_RANGE',
'MAX_TRACE_LENGTH',
'MIN_COORD_FLOAT',
'MIN_COORD_FRACTION',
'MIN_COORD_INTEGER',
'Ray',
'Surface',
'SurfaceFlags',
'TraceFilter',
'TraceFilterSimple',
'TraceType',
'engine_trace',
)
# =============================================================================
# >> ENUMERATORS
# =============================================================================
[docs]class ContentFlags(IntFlag):
"""Content flags wrapper enumerator."""
EMPTY = CONTENTS_EMPTY
SOLID = CONTENTS_SOLID
WINDOW = CONTENTS_WINDOW
AUX = CONTENTS_AUX
GRATE = CONTENTS_GRATE
SLIME = CONTENTS_SLIME
WATER = CONTENTS_WATER
BLOCKLOS = CONTENTS_BLOCKLOS
OPAQUE = CONTENTS_OPAQUE
LAST_VISIBLE = LAST_VISIBLE_CONTENTS
ALL_VISIBLE = ALL_VISIBLE_CONTENTS
TESTFOGVOLUME = CONTENTS_TESTFOGVOLUME
UNUSED = CONTENTS_UNUSED
TEAM1 = CONTENTS_TEAM1
TEAM2 = CONTENTS_TEAM2
IGNORE_NODRAW_OPAQUE = CONTENTS_IGNORE_NODRAW_OPAQUE
MOVEABLE = CONTENTS_MOVEABLE
AREAPORTAL = CONTENTS_AREAPORTAL
PLAYERCLIP = CONTENTS_PLAYERCLIP
MONSTERCLIP = CONTENTS_MONSTERCLIP
CURRENT_0 = CONTENTS_CURRENT_0
CURRENT_90 = CONTENTS_CURRENT_90
CURRENT_180 = CONTENTS_CURRENT_180
CURRENT_270 = CONTENTS_CURRENT_270
CURRENT_UP = CONTENTS_CURRENT_UP
CURRENT_DOWN = CONTENTS_CURRENT_DOWN
ORIGIN = CONTENTS_ORIGIN
MONSTER = CONTENTS_MONSTER
DEBRIS = CONTENTS_DEBRIS
DETAIL = CONTENTS_DETAIL
TRANSLUCENT = CONTENTS_TRANSLUCENT
LADDER = CONTENTS_LADDER
HITBOX = CONTENTS_HITBOX
[docs]class ContentMasks(IntFlag):
"""Content masks wrapper enumerator."""
ALL = MASK_ALL
SOLID = MASK_SOLID
PLAYER_SOLID = MASK_PLAYERSOLID
NPC_SOLID = MASK_NPCSOLID
WATER = MASK_WATER
OPAQUE = MASK_OPAQUE
OPAQUE_AND_NPCS = MASK_OPAQUE_AND_NPCS
BLOCKLOS = MASK_BLOCKLOS
BLOCKLOS_AND_NPCS = MASK_BLOCKLOS_AND_NPCS
VISIBLE = MASK_VISIBLE
VISIBLE_AND_NPCS = MASK_VISIBLE_AND_NPCS
SHOT = MASK_SHOT
SHOT_HULL = MASK_SHOT_HULL
SHOT_PORTAL = MASK_SHOT_PORTAL
SOLID_BRUSH_ONLY = MASK_SOLID_BRUSHONLY
PLAYER_SOLID_BRUSH_ONLY = MASK_PLAYERSOLID_BRUSHONLY
NPC_WORLD_STATIC = MASK_NPCWORLDSTATIC
SPLIT_AREA_PORTAL = MASK_SPLITAREAPORTAL
CURRENT = MASK_CURRENT
DEAD_SOLID = MASK_DEADSOLID
# =============================================================================
# >> CLASSES
# =============================================================================
[docs]class TraceFilterSimple(TraceFilter):
"""A simple trace filter."""
[docs] def __init__(self, ignore=(), trace_type=TraceType.EVERYTHING):
"""Initialize the filter.
:param iterable ignore:
An iterable of entity indexes to ignore. The trace will not hit
these entities.
:param TraceType trace_type:
The trace type that should be used.
"""
super().__init__()
self.trace_type = trace_type
self.ignore = set(map(inthandle_from_baseentity, ignore))
[docs] def should_hit_entity(self, entity, mask):
"""Called when a trace is about to hit an entity.
:param HandleEntity entity:
The entity that should be hit.
:param int mask:
The mask that was used to intialize the trace.
:rtype: bool
"""
return entity.basehandle.to_int() not in self.ignore
[docs] def get_trace_type(self):
"""Return the trace type.
:rtype: TraceType
"""
return self.trace_type