LastMUD/internal/game/systems/event.go

71 lines
1.6 KiB
Go
Raw Normal View History

package systems
import (
"fmt"
"time"
"code.haedhutner.dev/mvv/LastMUD/internal/ecs"
"code.haedhutner.dev/mvv/LastMUD/internal/game/data"
"code.haedhutner.dev/mvv/LastMUD/internal/logging"
)
type eventError struct {
err string
}
func createEventError(v ...any) *eventError {
return &eventError{
err: fmt.Sprint(v...),
}
}
func (e *eventError) Error() string {
return e.err
}
func EventTypeQuery(eventType data.EventType) func(comp data.EventComponent) bool {
return func(comp data.EventComponent) bool {
return comp.EventType == eventType
}
}
func CreateEventSystems() []*ecs.System {
return []*ecs.System{
ecs.CreateSystem("PlayerConnectEventHandlerSystem", 0, handlePlayerConnectEvents),
}
}
func handlePlayerConnectEvents(world *ecs.World, delta time.Duration) (err error) {
events := ecs.QueryEntitiesWithComponent(world, EventTypeQuery(data.EventPlayerConnect))
processedEvents := []ecs.Entity{}
for event := range events {
err = handlePlayerConnectEvent(world, event)
if err != nil {
logging.Error("PlayerConnect Error: ", err)
}
processedEvents = append(processedEvents, event)
}
ecs.DeleteEntities(world, processedEvents...)
return
}
func handlePlayerConnectEvent(world *ecs.World, entity ecs.Entity) (err error) {
logging.Warn("Player connect")
connectionId, ok := ecs.GetComponent[data.ConnectionIdComponent](world, entity)
if !ok {
return createEventError("Event does not contain connectionId")
}
data.CreatePlayer(world, connectionId.ConnectionId, data.PlayerStateJoining)
data.CreateGameOutput(world, connectionId.ConnectionId, []byte("Welcome to LastMUD!"))
return
}