| 
									
										
										
										
											2024-02-11 13:00:56 +01:00
										 |  |  | 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) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-02-11 14:24:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (observer *PlayerObserver) RemoveEntities() { | 
					
						
							|  |  |  | 	observer.Entities = make(map[ecs.Entity]int) | 
					
						
							|  |  |  | } |