Source code for effects.hooks
# ../effects/hooks.py
"""Provides hooking effect functionality."""
# =============================================================================
# >> IMPORTS
# =============================================================================
# Source.Python Imports
# Core
from core import AutoUnload
# Effects
from effects.base import TempEntity
from effects.templates import temp_entity_templates
# Engines
from engines.server import engine_server
# Filters
from filters.recipients import RecipientFilter
# Memory
from memory import get_virtual_function
from memory import make_object
from memory.hooks import HookType
from memory.hooks import PreHook
# =============================================================================
# >> ALL DECLARATION
# =============================================================================
__all__ = ('TempEntityPreHook',
)
# =============================================================================
# >> CLASSES
# =============================================================================
[docs]class TempEntityPreHook(AutoUnload):
"""Decorator used to create temp entity pre hooks that auto unload."""
[docs] def __init__(self, temp_entity_name):
"""Initialize the hook object.
:param str temp_entity_name:
The name of the temp entity to hook.
"""
# Get and store the temp entity template...
self.template = temp_entity_templates[temp_entity_name]
# Set the callback to None...
self.callback = None
def __call__(self, callback):
"""Store the callback and try initialize the hook."""
# Store the callback...
self.callback = callback
# Initialize the hook...
self.template.add_hook(callback)
# Return the callback...
return callback
def _unload_instance(self):
"""Unload the hook."""
# Exit the call if the callback wasn't registered...
if self.callback is None:
return
# Unregister the hook...
self.template.remove_hook(self.callback)
class TempEntityPostHook(TempEntityPreHook):
"""Decorator used to create temp entity post hooks that auto unload."""
def __init__(self, temp_entity_name):
"""Initialize the hook object.
:param str temp_entity_name:
The name of the temp entity to hook.
"""
from warnings import warn
warn(
'TempEntityPostHook has been deprecated and will be entirely '
'unsupported in a future update. Use TempEntityPreHook instead '
'or register your own post hook on '
'CEngineServer::PlaybackTempEntity/CBaseTempEntity::Create.')
super().__init__(temp_entity_name)
# =============================================================================
# >> HOOKS
# =============================================================================
@PreHook(get_virtual_function(engine_server, 'PlaybackTempEntity'))
def pre_playback_temp_entity(stack_data):
"""Handle pre hooks."""
temp_entity = TempEntity(stack_data[3])
try:
recipients = make_object(RecipientFilter, stack_data[1])
except RuntimeError:
global _recipients
_recipients = RecipientFilter.from_abstract_pointer(stack_data[1])
stack_data[1] = recipients = _recipients
return temp_entity.template.handle_hook(temp_entity, recipients)