2023-06-25 06:51:21 +00:00
|
|
|
package entity
|
|
|
|
|
|
|
|
import (
|
|
|
|
"log"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Chunk struct {
|
|
|
|
Position ChunkPosition
|
2023-06-25 08:33:17 +00:00
|
|
|
Entities map[Entity]struct{}
|
2023-06-25 06:51:21 +00:00
|
|
|
lock sync.Mutex
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewChunk(position ChunkPosition) *Chunk {
|
|
|
|
return &Chunk{
|
|
|
|
Position: position,
|
2023-06-25 08:33:17 +00:00
|
|
|
Entities: make(map[Entity]struct{}),
|
2023-06-25 06:51:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Chunk) AddEntity(entity Entity) {
|
2023-06-25 08:33:17 +00:00
|
|
|
c.Entities[entity] = struct{}{}
|
2023-06-25 06:51:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Chunk) RemoveEntity(entity Entity) {
|
2023-06-25 08:33:17 +00:00
|
|
|
delete(c.Entities, entity)
|
2023-06-25 06:51:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// send packet to all peers in this chunk and kill each peer if error
|
|
|
|
func (c *Chunk) SendPacket(typeID uint32, pkt ...interface{}) {
|
|
|
|
c.lock.Lock()
|
|
|
|
defer c.lock.Unlock()
|
|
|
|
|
2023-06-25 08:33:17 +00:00
|
|
|
for entity := range c.Entities {
|
2023-06-25 06:51:21 +00:00
|
|
|
if entity.GetKind() != ENTITY_KIND_PLAYER {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
plr, ok := entity.(*Player)
|
|
|
|
if !ok {
|
|
|
|
log.Panic("Chunk.SendPacket: entity kind was player, but is not a *Player")
|
|
|
|
}
|
|
|
|
peer := plr.Peer
|
|
|
|
|
|
|
|
if err := peer.Send(typeID, pkt...); err != nil {
|
2023-06-25 08:33:17 +00:00
|
|
|
log.Printf("Error sending packet to peer %p: %v", peer, err)
|
2023-06-25 06:51:21 +00:00
|
|
|
peer.Kill()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Chunk) GetAdjacentPositions() []ChunkPosition {
|
|
|
|
return []ChunkPosition{
|
|
|
|
{c.Position.X - 1, c.Position.Y - 1},
|
|
|
|
{c.Position.X - 1, c.Position.Y},
|
|
|
|
{c.Position.X - 1, c.Position.Y + 1},
|
|
|
|
{c.Position.X, c.Position.Y - 1},
|
|
|
|
{c.Position.X, c.Position.Y},
|
|
|
|
{c.Position.X, c.Position.Y + 1},
|
|
|
|
{c.Position.X + 1, c.Position.Y - 1},
|
|
|
|
{c.Position.X + 1, c.Position.Y},
|
|
|
|
{c.Position.X + 1, c.Position.Y + 1},
|
|
|
|
}
|
|
|
|
}
|
2023-06-25 08:33:17 +00:00
|
|
|
|
|
|
|
// https://stackoverflow.com/a/45428032 lol
|
|
|
|
func ChunkSliceDifference(a, b []*Chunk) []*Chunk {
|
|
|
|
m := make(map[*Chunk]struct{})
|
|
|
|
for _, item := range b {
|
|
|
|
m[item] = struct{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
var diff []*Chunk
|
|
|
|
for _, item := range a {
|
|
|
|
if _, ok := m[item]; !ok {
|
|
|
|
diff = append(diff, item)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return diff
|
|
|
|
}
|