role.go 2.27 KB
package models

import (
	"fmt"
	"pro2d/pb"
	"pro2d/src/common"
	"pro2d/src/components/db"
	"pro2d/src/components/logger"
	"pro2d/src/utils"
	"sync/atomic"
)

type RoleModel struct {
	*db.Schema
	Role  *pb.Role
	Heros HeroMap
	Teams *TeamModel
	Equip *EquipModels
	Prop  *PropModels

	lastSaveTs  int64
}

func RoleExistByUid(uid string) *RoleModel {
	data := &pb.Role{Uid: uid}

	if err := db.FindOne(db.GetBsonM("uid", uid), data); err != nil {
		logger.Error("Role exist err: %v", err)
		return nil
	}


	r := &RoleModel{
		Schema: db.NewSchema(data.Id, data),
		Role:    data,
		Heros:   make(HeroMap),
		Teams: new(TeamModel),
		Equip: new(EquipModels),
		Prop:  new(PropModels),
	}
	r.LoadAll()
	return r
}

func NewRole(id string) *RoleModel {
	data := &pb.Role{Id: id}
	m := &RoleModel{
		Schema: db.NewSchema(id, data),
		Role:    data,
		Heros:   make(HeroMap),
		Teams: new(TeamModel),
		Equip: new(EquipModels),
		Prop:  new(PropModels),
	}
	return m
}

func (m *RoleModel) LoadHero() {
	m.Heros["test"] = NewHero("")
	m.Heros["test"].Hero = &pb.Hero{
		Id:         "1",
		RoleId:     m.Role.Id,
		Type:       1,
		Level:      1,
		ReinCount:  0,
		ReinPoint:  0,
		Equipments: "123123",
	}
}

func (m *RoleModel) LoadTeams() {
	m.Teams = NewTeam("0")
	m.Teams.Team = &pb.Team{
		Id:      "1",
		HeroIds: "1",
	}
}

func (m *RoleModel) LoadEquips() {
	m.Equip = NewEquip("0")
	m.Equip.Equip = &pb.Equipment{
		Id:           "0",
		RoleId:       m.Role.Id,
		Type:         0,
		Equip:        false,
		EnhanceLevel: false,
	}
}

func (m *RoleModel) LoadAll()  {
	m.LoadHero()
	m.LoadTeams()
	m.LoadEquips()
}

func (m *RoleModel) updateProperty(property map[string]interface{}) {
}

func (m *RoleModel) AddHero(hero *pb.Hero) {
	h := NewHero(hero.Id)
	h.Hero = hero
	h.Create()
	m.Heros[fmt.Sprintf("%s%s", m.Role.Id, h.Hero.Id)] = h
}

func (m *RoleModel) GetAllHero() []*pb.Hero {
	var h []*pb.Hero
	for _, hero := range m.Heros {
		h = append(h, hero.Hero)
	}
	return h
}

func (m *RoleModel) OnRecoverTimer(now int64) {
	m.saveRoleData(now)
}

func (m *RoleModel) OnOfflineEvent() {
	// 设置最新的登录时间
	m.saveRoleData(utils.Timex())
}

func (m *RoleModel) saveRoleData(now int64) {
	if now - m.lastSaveTs < common.SaveDataInterval {
		return
	}
	atomic.StoreInt64(&m.lastSaveTs, now)
	m.Update()
}