import {AdjustmentFilter} from '@pixi/filter-adjustment'; import {GlowFilter} from '@pixi/filter-glow'; import {Container} from '@pixi/react'; import {useEffect, useState} from 'react'; import {usePacket} from '@/context/client.js'; import {useEcs, useEcsTick} from '@/context/ecs.js'; import {useMainEntity} from '@/context/main-entity.js'; import Entity from './entity.jsx'; export default function Entities({filters}) { const [ecs] = useEcs(); const [entities, setEntities] = useState({}); const [mainEntity] = useMainEntity(); const [radians, setRadians] = useState(0); const [willInteractWith, setWillInteractWith] = useState(0); const [interactionFilters] = useState([new AdjustmentFilter(), new GlowFilter({color: 0x0})]); const pulse = (Math.cos(radians) + 1) * 0.5; interactionFilters[0].brightness = (pulse * 0.75) + 1; interactionFilters[1].outerStrength = pulse * 0.5; usePacket('EcsChange', async () => { setEntities({}); }, [setEntities]); useEcsTick((payload) => { if (!ecs) { return; } const updatedEntities = {...entities}; for (const id in payload) { const update = payload[id]; if (false === update) { delete updatedEntities[id]; } else { if ('1' !== id) { updatedEntities[id] = ecs.get(id); if (update.Emitter?.emit) { updatedEntities[id].Emitter.emitting = { ...updatedEntities[id].Emitter.emitting, ...update.Emitter.emit, }; } } } } setEntities(updatedEntities); const main = ecs.get(mainEntity); if (main) { setWillInteractWith(main.Interacts.willInteractWith); } }, [ecs, entities, mainEntity]); useEffect(() => { setRadians(0); const handle = setInterval(() => { setRadians((radians) => (radians + 0.1) % (Math.PI * 2)) }, 50); return () => { clearInterval(handle); }; }, [willInteractWith]); const renderables = []; for (const id in entities) { const isHighlightedInteraction = id == willInteractWith; renderables.push( ); } return ( {renderables} ); }