package observers import ( "github.com/mlange-42/arche/ecs" "github.com/mlange-42/arche/ecs/event" "github.com/mlange-42/arche/generic" "github.com/mlange-42/arche/listener" ) // will be added as an ecs.Resource to the world so we can use it in // CollisionSystem to check for player collisions. type PlayerObserver struct { Entities map[ecs.Entity]int } // Create a new resource of type PlayerObserver which will hold all // player entities. We also add a Listener which looks for // EntityRemoved events and if a player gets removed, we also remove // it from the Entity map in our observer. func NewPlayerObserver(world *ecs.World) { observer := &PlayerObserver{} observer.Entities = make(map[ecs.Entity]int) resmanger := generic.NewResource[PlayerObserver](world) resmanger.Add(observer) listen := listener.NewCallback( func(world *ecs.World, event ecs.EntityEvent) { observerID := ecs.ResourceID[PlayerObserver](world) observer := world.Resources().Get(observerID).(*PlayerObserver) observer.RemoveEntity(event.Entity) }, event.EntityRemoved, ) world.SetListener(&listen) } func GetPlayerObserver(world *ecs.World) *PlayerObserver { observerID := ecs.ResourceID[PlayerObserver](world) observer := world.Resources().Get(observerID).(*PlayerObserver) return observer } func (observer *PlayerObserver) AddEntity(entity ecs.Entity) { observer.Entities[entity] = 1 } func (observer *PlayerObserver) RemoveEntity(entity ecs.Entity) { delete(observer.Entities, entity) } func (observer *PlayerObserver) RemoveEntities() { observer.Entities = make(map[ecs.Entity]int) }