UNPKG

cs2-gsi-z

Version:

A modular, event-driven Game State Integration (GSI) handler for Counter-Strike 2 built with Node.js.

52 lines (44 loc) 2.33 kB
import { EVENTS } from '../../constants/events.js'; import { DifferBase } from './DifferBase.js'; export class PlayerStateDiffer extends DifferBase { constructor({ logger = null } = {}) { super(); this.logger = (logger ?? { child: () => console }).child('PlayerStateDiffer'); this.logger.log('⚙️ instantiated correctly.'); } /** * Compares changes in the player's internal state (health, armor, money, etc.) and emits corresponding events. * * @param {GameState} prev Previous game state * @param {GameState} curr Current game state * @param {Object} emitter Event emission context * @param {Object} [options] Optional. Object with { previously, added } */ diff(prev, curr, emitter, options = {}) { if (!prev?.player && !curr?.player) return; const fields = [ { path: 'player.state.health', event: EVENTS.player.hpChanged }, { path: 'player.state.armor', event: EVENTS.player.armorChanged }, { path: 'player.state.helmet', event: EVENTS.player.helmetChanged }, { path: 'player.state.money', event: EVENTS.player.moneyChanged }, { path: 'player.state.flashed', event: EVENTS.player.flashedChanged }, { path: 'player.state.smoked', event: EVENTS.player.smokedChanged }, { path: 'player.state.burning', event: EVENTS.player.burningChanged }, { path: 'player.state.equipValue', event: EVENTS.player.equipValueChanged }, ]; for (const { path, event } of fields) { const prevVal = this.getFieldSafe(path, prev, this.previously); const currVal = this.getFieldSafe(path, curr, this.added); if (prevVal !== currVal) { this.logger.log(`🔄 Change in ${path}: ${prevVal} → ${currVal}`); this.emitWithContext(emitter, event, { previousus: prevVal, current: currVal }, 'player'); } } const prevMoney = this.getFieldSafe('player.state.money', prev, this.previously); const currMoney = this.getFieldSafe('player.state.money', curr, this.added); if (currMoney !== null && prevMoney !== null && currMoney > prevMoney) { const earned = currMoney - prevMoney; this.logger.log(`💵 Money earned: +${earned}`); this.emitWithContext(emitter, EVENTS.player.moneyEarned, { earned }, 'player'); } } }