actor.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package mail
  2. import (
  3. "f1-game/internal/event"
  4. nameActor "f1-game/internal/name/actor"
  5. nameEvent "f1-game/internal/name/event"
  6. nameRemote "f1-game/internal/name/remote"
  7. "f1-game/internal/sessions"
  8. cstring "github.com/cherry-game/cherry/extend/string"
  9. cfacade "github.com/cherry-game/cherry/facade"
  10. clog "github.com/cherry-game/cherry/logger"
  11. cactor "github.com/cherry-game/cherry/net/actor"
  12. )
  13. type actor struct {
  14. cactor.Base
  15. workerSize int
  16. }
  17. func NewActor(workerSize int) *actor {
  18. if workerSize < 1 {
  19. workerSize = 1
  20. }
  21. return &actor{
  22. workerSize: workerSize,
  23. }
  24. }
  25. func (p *actor) AliasID() string {
  26. return nameActor.Mail
  27. }
  28. func (p *actor) OnInit() {
  29. // 预先创建子actor
  30. for i := range p.workerSize {
  31. childID := cstring.ToString(i)
  32. childActor := &actorMail{}
  33. p.Child().Create(childID, childActor)
  34. }
  35. p.Event().Register(nameEvent.Player_Login, p.onLoginEvent)
  36. }
  37. func (p *actor) OnLocalReceived(m *cfacade.Message) (next bool, invoke bool) {
  38. playerID := m.Session.GetInt(sessions.PlayerID)
  39. childID := cstring.ToString(playerID % p.workerSize)
  40. if childActor, found := p.Child().Get(childID); found {
  41. childActor.PostLocal(m)
  42. }
  43. return false, false
  44. }
  45. func (p *actor) OnFindChild(m *cfacade.Message) (cfacade.IActor, bool) {
  46. playerID, ok := cstring.ToInt(m.TargetPath().ChildID, 0)
  47. if playerID < 1 || !ok {
  48. clog.Warnf("Target child ID error path = %s", m.TargetPath())
  49. return nil, false
  50. }
  51. childID := cstring.ToString(playerID % p.workerSize)
  52. return p.Child().Get(childID)
  53. }
  54. // onLoginEvent 每次登录检查是否有新的邮件模板
  55. func (p *actor) onLoginEvent(e cfacade.IEventData) {
  56. evt, ok := e.(*event.PlayerLogin)
  57. if !ok {
  58. return
  59. }
  60. // 每次登录时,检查邮件模板
  61. targetPath := p.NewChildPath(nameActor.Mail, evt.UniqueID())
  62. p.Call(targetPath, nameRemote.Mail_OnLogin, evt)
  63. }