cs2-gsi-z
Version:
A modular, event-driven Game State Integration (GSI) handler for Counter-Strike 2 built with Node.js.
65 lines (52 loc) β’ 2.35 kB
JavaScript
import { EVENTS } from '../../constants/events.js';
import { DifferBase } from './DifferBase.js';
export class WeaponDiffer extends DifferBase {
constructor({ logger = null } = {}) {
super();
this.logger = (logger ?? { child: () => console }).child('WeaponDiffer');
this.logger.log('βοΈ instantiated correctly.');
}
/**
* Compara cambios en el arma activa y emite eventos de Change of ammoClip y ammoReserve.
*
* @param {GameState} prev State anterior del juego
* @param {GameState} curr State actual del juego
* @param {Object} emitter Contexto de emisiΓ³n de eventos
* @param {Object} [options] Opcional. Objeto con { previously, added } */
diff(prev, curr, emitter, options = {}) {
this.logger.verbose('π diff() called');
if (!prev?.player && !curr?.player) return;
const prevWeapon = prev.player.activeWeapon;
const currWeapon = curr.player.activeWeapon;
this.logger.verbose('π prevWeapon:', prevWeapon);
this.logger.verbose('π currWeapon:', currWeapon);
if (!currWeapon || currWeapon.ammoClip === undefined) {
this.logger.warn('β οΈ Current active weapon incomplete or missing ammo_clip.');
return;
}
if (!prevWeapon || prevWeapon.ammoClip === undefined) {
this.logger.verbose('βΉοΈ No prevWeapon or ammoClip in prev. Waiting for next diff.');
return;
}
if (prevWeapon.ammoClip !== currWeapon.ammoClip) {
this.logger.log(`π ammoClip change: ${prevWeapon.ammoClip} β ${currWeapon.ammoClip}`);
emitter.emit(EVENTS.player.ammoClipChanged, {
previously: prevWeapon.ammoClip,
current: currWeapon.ammoClip,
});
}
if (prevWeapon.ammoReserve !== currWeapon.ammoReserve) {
this.logger.log(`π ammoReserve change: ${prevWeapon.ammoReserve} β ${currWeapon.ammoReserve}`);
emitter.emit(EVENTS.player.ammoReserveChanged, {
previously: prevWeapon.ammoReserve,
current: currWeapon.ammoReserve,
});
}
if (prevWeapon.name !== currWeapon.name) {
this.logger.log(`π Weapon changed: ${prevWeapon.name} β ${currWeapon.name}`);
emitter.emit(EVENTS.player.weaponChanged, {
previously: prevWeapon,
current: currWeapon,
});
}
}}