from listeners import OnEntitySpawned
from filters.entities import EntityIter
from entities.entity import Entity
from entities.constants import EntityEffects
from entities import CheckTransmitInfo
from entities.entity import BaseEntity
from memory import make_object
from memory.hooks import PreHook
from entities.helpers import index_from_edict
TRIGGER_START = 'trigger_'
def on_trigger_transmit(trigger, classname, index):
"""Called when a trigger should be transmitted.
:param BaseEntity trigger:
The trigger that should be transmitted to the client.
:param str classname:
The classname of the trigger to transmit (e.g. ``trigger_multiple``).
The value equals ``trigger.classname``.
:param int index:
The index of the player who should receive the data of the trigger.
:return:
Return ``True`` if the trigger should be transmitted. Return ``False``
if it shouldn't be transmitted (it will be invisible to the client).
:rtype: bool
"""
return True
def show_entity(entity):
entity.edict.clear_transmit_state()
entity.effects &= ~EntityEffects.NODRAW
# We can use the worldspawn entity, because it's using
# CBaseEntity::SetTransmit just like all triggers
@PreHook(Entity(0).set_transmit)
def pre_set_transmit(args):
entity = make_object(BaseEntity, args[0])
classname = entity.classname
if not classname.startswith(TRIGGER_START):
return
info = make_object(CheckTransmitInfo, args[1])
index = index_from_edict(info.client)
if not on_trigger_transmit(entity, classname, index):
return False
@OnEntitySpawned
def on_entity_spawned(base_entity):
if base_entity.classname.startswith(TRIGGER_START):
show_entity(Entity(base_entity.index))
for trigger in EntityIter(TRIGGER_START, False):
show_entity(trigger)