package pvp import ( "fmt" "go_dreamfactory/comm" "go_dreamfactory/lego/base" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/timewheel" "go_dreamfactory/modules" "go_dreamfactory/pb" "sync" "time" "go.mongodb.org/mongo-driver/bson/primitive" ) /* 模块名:支付系统 描述:充值商城 开发:李伟 */ func NewModule() core.IModule { m := new(Pvp) return m } type Pvp struct { modules.ModuleBase service base.IRPCXService battle comm.IBattle api_comp *apiComp lock sync.RWMutex battles map[string]*BattleItem } //模块名 func (this *Pvp) GetType() core.M_Modules { return comm.ModulePvp } //模块初始化接口 注册用户创建角色事件 func (this *Pvp) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) { err = this.ModuleBase.Init(service, module, options) this.service = service.(base.IRPCXService) this.battles = make(map[string]*BattleItem) return } func (this *Pvp) Start() (err error) { err = this.ModuleBase.Start() var module core.IModule if module, err = this.service.GetModule(comm.ModuleBattle); err != nil { return } this.battle = module.(comm.IBattle) return } //装备组件 func (this *Pvp) OnInstallComp() { this.ModuleBase.OnInstallComp() this.api_comp = this.RegisterComp(new(apiComp)).(*apiComp) } //创建Pvp func (this *Pvp) CreatePvp(red, blue *pb.PvpUserInfo, ptype pb.PvpType) (battleId string, code pb.ErrorCode) { var ( battle *BattleItem err error ) battleId = primitive.NewObjectID().Hex() battle = &BattleItem{ Id: battleId, Ptype: ptype, State: pb.PvpState_ready, Red: red, Blue: blue, readytimer: timewheel.Add(time.Second*15, this.readyTimeOut, battleId), } this.lock.Lock() this.battles[battle.Id] = battle this.lock.Unlock() if err = this.SendMsgToUsers(string(comm.ModulePvp), "ready", &pb.PvpReadyPush{ ServicePath: fmt.Sprintf("%s/%s", this.service.GetType(), this.service.GetId()), Battleid: battle.Id, Red: battle.Red, Blue: battle.Blue, Countdown: 15, }, red.Uid, blue.Uid); err != nil { this.Errorln(err) code = pb.ErrorCode_RpcFuncExecutionError } return } //推送战斗输出指令 func (this *Pvp) PvpOutCmdPush(out *pb.PvpOutCmdPush) { } //推送战斗结束 func (this *Pvp) PvpFinishPush(battleId string) { } //准备超时 取消战斗 func (this *Pvp) readyTimeOut(task *timewheel.Task, args ...interface{}) { var ( id string battle *BattleItem ok bool err error ) id = args[0].(string) this.lock.RLock() battle, ok = this.battles[id] this.lock.RUnlock() if ok && battle.State == pb.PvpState_ready { battle.lock.Lock() battle.State = pb.PvpState_cancel battle.lock.Unlock() this.lock.Lock() delete(this.battles, id) this.lock.Unlock() if err = this.SendMsgToUsers(string(comm.ModulePvp), "cancel", &pb.PvpCancelPush{ ServicePath: fmt.Sprintf("%s/%s", this.service.GetType(), this.service.GetId()), Battleid: battle.Id, }, battle.Red.Uid, battle.Blue.Uid); err != nil { this.Errorln(err) } } } //开始战斗 func (this *Pvp) startBattle(battle *BattleItem) { var ( record *pb.DBBattleRecord info *pb.BattleInfo code pb.ErrorCode err error ) if code, record = this.battle.CreateRtPvpBattle(&pb.BattleRTPVPReq{ Ptype: pb.PlayType_friendsmeet, Title: "", RedCompId: battle.Red.Uid, Redformat: []*pb.BattleFormation{battle.Redformation}, BlueCompId: battle.Blue.Uid, Bulefformat: []*pb.BattleFormation{battle.Blueformation}, }); code != pb.ErrorCode_Success { this.lock.Lock() delete(this.battles, battle.Id) this.lock.Unlock() if err = this.SendMsgToUsers(string(comm.ModulePvp), "cancel", &pb.PvpCancelPush{ ServicePath: fmt.Sprintf("%s/%s", this.service.GetType(), this.service.GetId()), Battleid: battle.Id, }, battle.Red.Uid, battle.Blue.Uid); err != nil { this.Errorln(err) } } else { record.Id = battle.Id info = &pb.BattleInfo{ Id: record.Id, Title: record.Title, Btype: record.Btype, Ptype: record.Ptype, RedCompId: record.RedCompId, Redflist: record.Redflist, BlueCompId: record.BlueCompId, Buleflist: record.Buleflist, } if code = this.battle.CreateBattleServer(info); code != pb.ErrorCode_Success { this.lock.Lock() delete(this.battles, battle.Id) this.lock.Unlock() if err = this.SendMsgToUsers(string(comm.ModulePvp), "cancel", &pb.PvpCancelPush{ ServicePath: fmt.Sprintf("%s/%s", this.service.GetType(), this.service.GetId()), Battleid: battle.Id, }, battle.Red.Uid, battle.Blue.Uid); err != nil { this.Errorln(err) } } else { if err = this.SendMsgToUsers(string(comm.ModulePvp), "start", &pb.PvpStartPush{ Info: info, }, battle.Red.Uid, battle.Blue.Uid); err != nil { this.Errorln(err) } } } }