71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package world
|
|
|
|
import (
|
|
"a301_game_server/internal/entity"
|
|
"a301_game_server/pkg/mathutil"
|
|
)
|
|
|
|
// AOIEvent represents an entity entering or leaving another entity's area of interest.
|
|
type AOIEvent struct {
|
|
Observer entity.Entity
|
|
Target entity.Entity
|
|
Type AOIEventType
|
|
}
|
|
|
|
type AOIEventType int
|
|
|
|
const (
|
|
AOIEnter AOIEventType = iota
|
|
AOILeave
|
|
)
|
|
|
|
// AOIManager determines which entities can see each other.
|
|
type AOIManager interface {
|
|
Add(ent entity.Entity)
|
|
Remove(ent entity.Entity) []AOIEvent
|
|
UpdatePosition(ent entity.Entity, oldPos, newPos mathutil.Vec3) []AOIEvent
|
|
GetNearby(ent entity.Entity) []entity.Entity
|
|
}
|
|
|
|
// BroadcastAllAOI is a trivial AOI that treats all entities as visible to each other.
|
|
// Used when AOI is disabled for debugging/comparison.
|
|
type BroadcastAllAOI struct {
|
|
entities map[uint64]entity.Entity
|
|
}
|
|
|
|
func NewBroadcastAllAOI() *BroadcastAllAOI {
|
|
return &BroadcastAllAOI{
|
|
entities: make(map[uint64]entity.Entity),
|
|
}
|
|
}
|
|
|
|
func (b *BroadcastAllAOI) Add(ent entity.Entity) {
|
|
b.entities[ent.EntityID()] = ent
|
|
}
|
|
|
|
func (b *BroadcastAllAOI) Remove(ent entity.Entity) []AOIEvent {
|
|
delete(b.entities, ent.EntityID())
|
|
var events []AOIEvent
|
|
for _, other := range b.entities {
|
|
if other.EntityID() == ent.EntityID() {
|
|
continue
|
|
}
|
|
events = append(events, AOIEvent{Observer: other, Target: ent, Type: AOILeave})
|
|
}
|
|
return events
|
|
}
|
|
|
|
func (b *BroadcastAllAOI) UpdatePosition(_ entity.Entity, _, _ mathutil.Vec3) []AOIEvent {
|
|
return nil
|
|
}
|
|
|
|
func (b *BroadcastAllAOI) GetNearby(ent entity.Entity) []entity.Entity {
|
|
result := make([]entity.Entity, 0, len(b.entities)-1)
|
|
for _, e := range b.entities {
|
|
if e.EntityID() != ent.EntityID() {
|
|
result = append(result, e)
|
|
}
|
|
}
|
|
return result
|
|
}
|