70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
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
|
|
}
|