go_dreamfactory/modules/plunder/model_land.go
2024-01-30 14:43:18 +08:00

117 lines
3.3 KiB
Go

package plunder
import (
"context"
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/mgo"
"go_dreamfactory/lego/sys/redis"
"go_dreamfactory/modules"
"go_dreamfactory/pb"
"go_dreamfactory/sys/configure"
"go_dreamfactory/utils"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
type modelLand struct {
modules.MCompModel
module *Plunder
}
func (this *modelLand) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
err = this.MCompModel.Init(service, module, comp, options)
this.TableName = comm.TablePlunderLand
this.module = module.(*Plunder)
return
}
// 获取岛基本数据
func (this *modelLand) getPlunderLandData(id string) (info *pb.DBPlunderLand, err error) {
info = &pb.DBPlunderLand{}
if err = this.GetListObj(comm.RDS_EMPTY, id, info); err != nil && err != mgo.MongodbNil {
this.module.Errorln(err)
return
}
return
}
// 修改岛信息
func (this *modelLand) changePlunderLandData(id string, update map[string]interface{}) (err error) {
err = this.ChangeList(comm.RDS_EMPTY, id, update)
return
}
func (this *modelLand) createPlunderLandData(user *pb.DBPlunder) (land *pb.DBPlunderLand, err error) {
var (
uids []string
other []string
users []*pb.DBPlunder
socre int32
eTime int64
)
eTime = this.module.modelLand.GetEndTime()
land = &pb.DBPlunderLand{
Id: primitive.NewObjectID().Hex(),
Ship: map[string]*pb.ShipData{},
Uinfo: make(map[int32]*pb.BaseUserInfo, 0),
Score: make(map[string]int32, 0),
Etime: eTime,
}
socre = user.Score - 100
if socre < 0 {
socre = 0
}
users = append(users, user) // 优先加入自己
cur, err := this.DB.Find(core.SqlTable(comm.TablePlunder), bson.M{"score": bson.M{"$gte": socre}, "uid": bson.M{"$ne": user.Uid}, "landid": ""}, options.Find().SetSkip(int64(0)).SetLimit(int64(19)))
for cur.Next(context.TODO()) {
tmp := &pb.DBPlunder{}
if err = cur.Decode(tmp); err == nil {
users = append(users, tmp)
other = append(other, tmp.Uid)
}
}
sz := utils.RandomNumbers(0, 20, len(users))
for k, v := range users {
land.Uinfo[int32(sz[k])] = v.Uinfo
}
if err = this.AddList(comm.RDS_EMPTY, land.Id, land); err != nil {
return
}
if _, err = this.module.modelRecord.getPlunderRecordData(land.Id); err != nil {
return
}
for _, v := range users {
uids = append(uids, v.Uid)
}
if err = this.module.modelPlunder.RedisDels(other); err != nil {
return
}
if _, err = this.DB.UpdateMany(core.SqlTable(comm.TablePlunder), bson.M{"uid": bson.M{"$in": uids}}, bson.M{"$set": bson.M{"landid": land.Id}}); err != nil {
fmt.Printf("err:%v", err)
return
}
return
}
// 创建分布式锁
func (this *modelLand) landMutexLock(oid string) (result *redis.RedisMutex, err error) {
return this.module.modelLand.NewRedisMutex(fmt.Sprintf("%s-%s_lock", this.TableName, oid), 5)
}
// 获取结束时间
func (this *modelLand) GetEndTime() (newTime int64) {
opentime := this.module.service.GetOpentime().Unix() // 开服时间
subTime := (configure.Now().Unix() - opentime) % int64(this.module.ModuleTools.GetGlobalConf().PlunderPvpSeasontime)
st := 24 - this.module.ModuleTools.GetGlobalConf().PlunderPvpEndtime
newTime = utils.GetZeroTime(configure.Now().Unix()) + subTime*24*3600 - int64(st*3600)
return
}