import {compose} from '@avocado/core'; import {Vector} from '@avocado/math'; import {StateProperty, Trait} from '../trait'; import { TraitUpdateDirectionalDirectionPacket, } from '../packets/trait-update-directional-direction.packet'; const decorate = compose( StateProperty('direction', { track: true, }), ); export class Directional extends decorate(Trait) { static defaultParams() { return { directionCount: 1, trackMovement: true, }; } static defaultState() { return { direction: 0, }; } static type() { return 'directional'; } constructor(entity, params, state) { super(entity, params, state); this.directionCount = this.params.directionCount; } acceptPacket(packet) { if (packet instanceof TraitUpdateDirectionalDirectionPacket) { this.entity.direction = packet.data; } } packets(informed) { const {direction} = this.stateDifferences(); if (direction) { return new TraitUpdateDirectionalDirectionPacket(direction.value); } } listeners() { const listeners = { directionChanged: () => { this._directionChanged = true; }, }; if (this.params.trackMovement) { listeners.movementRequest = (vector) => { if (Vector.isZero(vector)) { return; } this.entity.direction = Vector.toDirection(vector, this.directionCount); }; } return listeners; } }