package show import ( capp "f1-game/internal/cherry_app" "f1-game/internal/data" "f1-game/internal/enum" "f1-game/internal/event" "f1-game/internal/facade" nameRoute "f1-game/internal/name/route" "f1-game/internal/pb" "f1-game/internal/sessions" "f1-game/nodes/map/internal/db" "slices" clog "github.com/cherry-game/cherry/logger" cproto "github.com/cherry-game/cherry/net/proto" ) func Service() *service { return &service{} } type service struct { facade.PlayerServiceBase[*db.MapPlayerTable] } func (p *service) OnLogin(playerTable *db.MapPlayerTable, session *cproto.Session) { for _, showRow := range data.MapMainCityShow.List() { // 道具激活跳过 if showRow.ActiveType == enum.ShowActiveType_Item { continue } // 当前激活条件不需要 if showRow.ActiveCondition.Key <= 0 && showRow.ActiveCondition.Value <= 0 { _, found := playerTable.Shows.GetShow(showRow.MainCityShowID) if !found { playerTable.Shows.ActiveShow(showRow.MainCityShowID, showRow.ExpireTime, true) playerTable.SetChangeData() } } } } // Push 推送主城外观数据 func (p *service) Push(mapPlayerTable *db.MapPlayerTable, session *cproto.Session) { resp := mapPlayerTable.Shows.ToProto() sessions.PushWithSession(session, nameRoute.PushMapPlayer_MainCityShow, resp) } // ChangePush 推送主城外观变更 func (p *service) ChangePush(playerTable *db.MapPlayerTable, delShowIDs []int32, changeShowIDs ...int32) { if len(delShowIDs) <= 0 && len(changeShowIDs) <= 0 { return } session, found := sessions.GetSession(playerTable.PlayerID) if !found { return } resp := &pb.MainCityShowChangePush{} if len(delShowIDs) > 0 { resp.DelShowIDs = delShowIDs } for _, changeShowID := range changeShowIDs { show, found := playerTable.Shows.GetShow(changeShowID) if !found { clog.Errorf("change show not found. playerID:%d, showID:%d", playerTable.PlayerID, changeShowID) continue } resp.List = append(resp.List, show.ToShowProto(changeShowID)) } sessions.PushWithSession(session, nameRoute.PushMapPlayer_MainCityShowChange, resp) } func (p *service) CheckMainCityShowExpire(playerTable *db.MapPlayerTable, nowSecond int64) { if len(playerTable.Shows.ShowMap) <= 0 { return } // 获取过期的外观 delShowIDs := playerTable.Shows.CheckExpire(nowSecond) if len(delShowIDs) <= 0 { return } if slices.Contains(delShowIDs, playerTable.Shows.MainCityShowID) { oldShowID := playerTable.Shows.MainCityShowID playerTable.Shows.MainCityShowID = 0 // 发送变更事件 capp.PostEvent(event.NewMainCityShowChange(playerTable.PlayerID, oldShowID)) } playerTable.Save2Queue() p.ChangePush(playerTable, delShowIDs) }