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