66# =============================================================================
77# >> IMPORTS
88# =============================================================================
9- # Python
10- import collections
9+ # Python Imports
10+ from collections import defaultdict
1111
12- # Source.Python
12+ # Source.Python Imports
1313# Engines
1414from engines .server import global_vars
1515# Listeners
16- from listeners import OnClientDisconnect
16+ from listeners import on_client_disconnect_listener_manager
1717# Memory
18- import memory
19-
20- from memory .hooks import PreHook
18+ from memory import get_virtual_function
19+ from memory .hooks import HookType
2120
2221
2322# =============================================================================
4039# =============================================================================
4140# >> CLASSES
4241# =============================================================================
43- class _MuteManager (collections . defaultdict ):
42+ class _MuteManager (defaultdict ):
4443 """A singleton that manages muting players."""
44+ _set_client_listening = None
45+
46+ @classmethod
47+ def _hook_set_client_listening (cls ):
48+ if cls ._set_client_listening is not None :
49+ return
50+
51+ function = get_virtual_function (voice_server , 'SetClientListening' )
52+ function .add_hook (HookType .PRE , _pre_set_client_listening )
53+
54+ cls ._set_client_listening = function
55+
56+ on_client_disconnect_listener_manager .register_listener (_on_client_disconnect )
4557
4658 @staticmethod
4759 def _get_receivers (receivers ):
@@ -75,6 +87,8 @@ def mute_player(self, sender, receivers=None):
7587 that contains the player indexes that shouldn't hear the sender
7688 anymore.
7789 """
90+ self ._hook_set_client_listening ()
91+
7892 for receiver in self ._get_receivers (receivers ):
7993 self [receiver ].add (sender )
8094
@@ -111,7 +125,6 @@ def is_muted(self, sender, receivers=None):
111125# =============================================================================
112126# >> CALLBACKS
113127# =============================================================================
114- @PreHook (memory .get_virtual_function (voice_server , 'SetClientListening' ))
115128def _pre_set_client_listening (args ):
116129 """Called before IVoiceServer::SetClientListening is called."""
117130 receiver = args [1 ]
@@ -122,7 +135,6 @@ def _pre_set_client_listening(args):
122135 args [3 ] = False
123136
124137
125- @OnClientDisconnect
126138def _on_client_disconnect (index ):
127139 """Called when a player left the server."""
128140 # Unmute the player, so the next player who gets this index won't be muted
0 commit comments