33// be found in the LICENSE file.
44
55import { PlayerEventObserver } from 'components/events/player_event_observer.js' ;
6+ import { SAMPCACEventObserver } from 'components/events/sampcac_event_observer.js' ;
67import { Vector } from 'base/vector.js' ;
78
89// Every how many milliseconds should pending deferred events be read from the server.
@@ -13,7 +14,9 @@ const kDeferredEventReadIntervalMs = 40; // 25Hz
1314// JavaScript to run in completely optimized mode without a series of adapters.
1415export class DeferredEventManager {
1516 disposed_ = false ;
16- observers_ = new Set ( ) ;
17+
18+ playerObservers_ = new Set ( ) ;
19+ sampcacObservers_ = new Set ( ) ;
1720
1821 // ---------------------------------------------------------------------------------------------
1922
@@ -42,6 +45,51 @@ export class DeferredEventManager {
4245 let player , killer , issuer , position ;
4346
4447 switch ( type ) {
48+ case 'CAC_OnCheatDetect' :
49+ player = server . playerManager . getById ( event . player_id ) ;
50+ if ( player ) {
51+ for ( const observer of this . sampcacObservers_ ) {
52+ observer . onPlayerCheatDetected (
53+ player , event . cheat_id , event . opt1 , event . opt2 ) ;
54+ }
55+ }
56+ break ;
57+
58+ case 'CAC_OnGameResourceMismatch' :
59+ player = server . playerManager . getById ( event . player_id ) ;
60+ if ( player ) {
61+ for ( const observer of this . sampcacObservers_ ) {
62+ observer . onPlayerGameResourceMismatch (
63+ player , event . model_id , event . component_type , event . checksum ) ;
64+ }
65+ }
66+ break ;
67+
68+ case 'CAC_OnMemoryRead' :
69+ player = server . playerManager . getById ( event . player_id ) ;
70+ if ( player ) {
71+ const buffer = new Uint8Array ( event . content ) ;
72+ for ( const observer of this . sampcacObservers_ )
73+ observer . onPlayerMemoryRead ( player , event . address , buffer ) ;
74+ }
75+ break ;
76+
77+ case 'CAC_OnPlayerKick' :
78+ player = server . playerManager . getById ( event . player_id ) ;
79+ if ( player ) {
80+ for ( const observer of this . sampcacObservers_ )
81+ observer . onPlayerKicked ( player , event . reason_id ) ;
82+ }
83+ break ;
84+
85+ case 'CAC_OnScreenshotTaken' :
86+ player = server . playerManager . getById ( event . player_id ) ;
87+ if ( player ) {
88+ for ( const observer of this . sampcacObservers_ )
89+ observer . onPlayerScreenshotTaken ( ) ;
90+ }
91+ break ;
92+
4593 case 'OnDynamicObjectMoved' :
4694 server . objectManager . onObjectMoved ( event ) ;
4795 break ;
@@ -72,12 +120,14 @@ export class DeferredEventManager {
72120 killer = server . playerManager . getById ( event . killerid ) ;
73121
74122 if ( player ) {
75- for ( const observer of this . observers_ )
123+ for ( const observer of this . playerObservers_ )
76124 observer . onPlayerDeath ( player , killer , event . reason ) ;
77125 }
78126
79127 // TODO: Migrate all the event listeners to observe |this|.
80- dispatchEvent ( 'playerresolveddeath' , event ) ;
128+ if ( ! server . isTest ( ) )
129+ dispatchEvent ( 'playerresolveddeath' , event ) ;
130+
81131 break ;
82132
83133 case 'OnPlayerSelectDynamicObject' :
@@ -93,7 +143,7 @@ export class DeferredEventManager {
93143 issuer = server . playerManager . getById ( event . issuerid ) ;
94144
95145 if ( player ) {
96- for ( const observer of this . observers_ ) {
146+ for ( const observer of this . playerObservers_ ) {
97147 observer . onPlayerTakeDamage (
98148 player , issuer , event . amount , event . weaponid , event . bodypart ) ;
99149 }
@@ -106,7 +156,7 @@ export class DeferredEventManager {
106156 position = new Vector ( event . fX , event . fY , event . fZ ) ;
107157
108158 if ( player ) {
109- for ( const observer of this . observers_ ) {
159+ for ( const observer of this . playerObservers_ ) {
110160 observer . onPlayerWeaponShot (
111161 player , event . weaponid , event . hittype , event . hitid , position ) ;
112162 }
@@ -124,23 +174,26 @@ export class DeferredEventManager {
124174
125175 // Adds the given |observer| to those receiving player events.
126176 addObserver ( observer ) {
127- if ( ! ( observer instanceof PlayerEventObserver ) )
177+ if ( observer instanceof PlayerEventObserver )
178+ this . playerObservers_ . add ( observer ) ;
179+ else if ( observer instanceof SAMPCACEventObserver )
180+ this . sampcacObservers_ . add ( observer ) ;
181+ else
128182 throw new Error ( `The given observer (${ observer } ) must inherit PlayerEventObserver.` ) ;
129-
130- this . observers_ . add ( observer ) ;
131183 }
132184
133- // Removes the given |observer| from those receiving player events.
185+ // Removes the given |observer| from those receiving any kinds of events.
134186 removeObserver ( observer ) {
135- if ( ! ( observer instanceof PlayerEventObserver ) )
136- throw new Error ( `The given observer (${ observer } ) must inherit PlayerEventObserver.` ) ;
137-
138- this . observers_ . delete ( observer ) ;
187+ this . playerObservers_ . delete ( observer ) ;
188+ this . sampcacObservers_ . delete ( observer ) ;
139189 }
140190
141191 // ---------------------------------------------------------------------------------------------
142192
143193 dispose ( ) {
144194 this . disposed_ = true ;
195+
196+ this . playerObservers_ . clear ( ) ;
197+ this . sampcacObservers_ . clear ( ) ;
145198 }
146199}
0 commit comments